19 / 18 / 5
Регистрация: 28.04.2010
Сообщений: 86
1

Польская запись

23.12.2010, 14:09. Показов 6258. Ответов 7
Метки нет (Все метки)

Здравствуйте, у меня возникли некоторые проблемы с данной задачей(если сказать точнее, то я ее вообще не понял):

Дано выражение (-a)-(-b). Организовать это выражение, используя алгоритм польской записи. Использовать программный стек.

Что вообще должно получиться и как реализовать? Кто поможет, буду очень благодарен!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2010, 14:09
Ответы с готовыми решениями:

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

Обратная польская запись
Помогите написать программу для вычисления обратной польской записи, использовав стек. Например,...

Обратная польская запись
Что такое обратная польская запись и как её реализовать на С++? Почему когда в программе я пишу...

Обратная польская запись
Простите что не совсем в том разделе, просто его больше всего людей посещает) По теме: Как при...

7
программист С++
841 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
23.12.2010, 14:47 2
Парсим строку по след алгоритму. Результатом является строка в польской записи
 Операнд и константа заносятся в Полиз и в таблицу.
 Левая скобка заносится в стек.
 Правая скобка вытесняет последовательно все операции из стека в Полиз, пока верхний элемент стека не является левой скобкой. Затем левая скобка удаляется из стека.
 Операция заносится в стек, если ее приоритет больше приоритета верхней операции в стеке, либо если сверху лежит левая скобка. В противном случае поочередно вытесняются все операции из стека в Полиз, пока не будут выполнятся условия первого случая, после чего операция заносится в стек.
В конце все операции из стека последовательно переносятся в Полиз.


а приоритеты следущие '(' <= '+' == '-' <= '*' == '/' <= '^'
Калькулятор, воспринимающий строку вот тут эта прога

(-a)-(-b) == a-b--
0
Эксперт С++
5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
23.12.2010, 16:09 3
sandye51, и как, по-вашему, можно вычислить это выражение на стековом калькуляторе? Надо же всё-таки отличать унарные операции от бинарных. Так что верно скорее будет нечто такое: -a -b -
0
программист С++
841 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
23.12.2010, 16:29 4
silent_1991, тут 2 способам есть, либо расставлять 0 в случаях (-a)
либо когда минус интерпретировать как унарную операцию, и при анализе при встрече минуса раскладывать его на 2 операции - и +

в моей работе реализован первый вариант

P.S. польская запись для любого выражения единственная, и для примера выше будет такой, как я написал. А вопрос уже в другом, будет ли данное выражение корректно или нет? без необходимых замечаний....
0
Эксперт С++
5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
23.12.2010, 16:34 5
sandye51, суть в том, чтобы интерпретировать унарный минус как отдельную операцию (возможно, при синтаксическом анализе заменять унарный минус на другой символ, например, на "_"), и считать набор _a неделимой лексемой, а вот уже при вычислении вспоминать, что на самом деле _a - это (-1) * a.
А вообще, насколько мне помнится, изначально ПолИЗ не позволяет вычислять выражения, содержащие унарные операции, поэтому, чтобы эту возможность ввести, приходится всячески исхитряться.
0
программист С++
841 / 600 / 147
Регистрация: 19.12.2010
Сообщений: 2,014
23.12.2010, 18:39 6
silent_1991, ты не понял, я говорил чтобы всегда интерпретировать минус как унарную операцию. Но правильнее было бы вставлять 0, где это требуется (а именно в случаях, если минус стоит в начале выражения, либо перед открывающейся скобкой). Как по правилам арифметики, ведь -a изначает 0-a, но просто 0 опускается.
и никаких геморроев с _а не надо.
0
37 / 36 / 4
Регистрация: 08.08.2010
Сообщений: 162
23.12.2010, 18:49 7
А почему бы не отдельную операцию ± которая берёт со стека число, делает его отрицательным и возвращает обратно?
Получается: (a±b±-)
Хотя тогда (ab±±-) будет неправильным...
0
Эксперт С++
5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
23.12.2010, 19:08 8
Ну так эта операция тоже будет унарной, её ПолИЗ также поддерживать не будет. А вообще я почти это и предлагал - ввести новое обозначение для унарного минуса. Я, когда реализовывал ОПЗ - так и делал.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2010, 19:08
Помогаю со студенческими работами здесь

Обратная польская запись
Подскажите, как по обратной польской записи выражения построить дерево выражения Например:...

Обратная польская запись
Доброго времени суток. Нужно сделать программу которая переводит арифм. выражение в обратную...

Обратная польская запись
В обратной польской записи, которую также называют постфиксной, операция записывается после двух...

Обратная польская запись
Добрый день, подскажите, как будет выглядеть обратная польская запись для for (i=0;i&lt;n;i++){...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru