19 / 18 / 5
Регистрация: 28.04.2010
Сообщений: 86
|
|
1 | |
Польская запись23.12.2010, 14:09. Показов 6258. Ответов 7
Метки нет Все метки)
(
Здравствуйте, у меня возникли некоторые проблемы с данной задачей(если сказать точнее, то я ее вообще не понял):
Дано выражение (-a)-(-b). Организовать это выражение, используя алгоритм польской записи. Использовать программный стек. Что вообще должно получиться и как реализовать? Кто поможет, буду очень благодарен!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
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
|
23.12.2010, 19:08 | |
Помогаю со студенческими работами здесь
8
Обратная польская запись Обратная польская запись Обратная польская запись Обратная польская запись Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |