IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Стек. Проверка правильности формулы.
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Задание вот такое, не пойму как реализовать через стек. Помогите пожалуйста, достаточно будет алгоритма, дальше разберусь.

Дан текстовый файл. Используя стек, проверить, является ли содержимое
текстового файла правильной записью формулы вида:
<Формула> ::= <Терм> | <Терм> + <Формула> | <Терм> - <Формула>
<Терм> ::= < Имя > | (<Формула>)
< Имя > ::= x | y | z
(что-то вроде x(x+z(y-x)), такого типа как я понимаю записи)

Заранее спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(hzch @ 11.10.2007 16:20) *
(что-то вроде x(x+z(y-x)), такого типа как я понимаю записи)

Нет.. Смотри внимательнее. Термы не могут стоять просто рядом. Между ними должен быть знак операции.
Скорее, типа так: x-(x+z-(y-x+z)+x+(x))

Проверку с помощью стека можно сделать примерно так..
Организуешь стек из символов. Делаешь проход по выражению слева направо.
Дальше я обозначаю последний символ стека как s (он же s0), а предпоследний - s1.

1. Если запись пустая, то [если глубина стека=1 или s=имя - успех, в остальных случаях - ошибка].

2. Первый символ проверяемой записи кладем в t (в записи его стираем).

3. Если t=имя, то [если стек пустой или s=( - кладем t в стек, в остальных случаях - ошибка].

4. Если t=операция, то [если если s - имя, то вынимаем s, в остальных случаях - ошибка]

5. Если t=(, то [если стек пустой или s=опер или s=(, то кладем t в стек; в остальных случаях - ошибка]

6. Если t=), то [если s=имя и s1=(, вынимаем 2 символа из стека, причем s закладываем в t и переходим на 3].

7. Переходим на 1.

Не очень красиво, но, думаю, верно... Наверное, можно лучше сделать.
Прога по этому алгоритму у меня, вроде, работает.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Большое спасибо!
Все заработало, правда немного видоизменил алгоритм. Надеюсь что понял как подобные задания делать) Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 2
Пол: Мужской
Реальное имя: Bhf

Репутация: -  0  +


Можешь показать как организовал программу?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.10.2020 0:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name