Форум программистов, компьютерный форум CyberForum.ru

Польская запись - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
NikITKA123
19 / 18 / 1
Регистрация: 28.04.2010
Сообщений: 86
23.12.2010, 14:09     Польская запись #1
Здравствуйте, у меня возникли некоторые проблемы с данной задачей(если сказать точнее, то я ее вообще не понял):

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

Что вообще должно получиться и как реализовать? Кто поможет, буду очень благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2010, 14:09     Польская запись
Посмотрите здесь:

польская запись C++
обратная польская запись. C++
Обратная польская запись C++
Обратная польская запись C++
Обратная польская запись C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 14:47     Польская запись #2
Парсим строку по след алгоритму. Результатом является строка в польской записи
 Операнд и константа заносятся в Полиз и в таблицу.
 Левая скобка заносится в стек.
 Правая скобка вытесняет последовательно все операции из стека в Полиз, пока верхний элемент стека не является левой скобкой. Затем левая скобка удаляется из стека.
 Операция заносится в стек, если ее приоритет больше приоритета верхней операции в стеке, либо если сверху лежит левая скобка. В противном случае поочередно вытесняются все операции из стека в Полиз, пока не будут выполнятся условия первого случая, после чего операция заносится в стек.
В конце все операции из стека последовательно переносятся в Полиз.


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

(-a)-(-b) == a-b--
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.12.2010, 16:09     Польская запись #3
sandye51, и как, по-вашему, можно вычислить это выражение на стековом калькуляторе? Надо же всё-таки отличать унарные операции от бинарных. Так что верно скорее будет нечто такое: -a -b -
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 16:29     Польская запись #4
silent_1991, тут 2 способам есть, либо расставлять 0 в случаях (-a)
либо когда минус интерпретировать как унарную операцию, и при анализе при встрече минуса раскладывать его на 2 операции - и +

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

P.S. польская запись для любого выражения единственная, и для примера выше будет такой, как я написал. А вопрос уже в другом, будет ли данное выражение корректно или нет? без необходимых замечаний....
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.12.2010, 16:34     Польская запись #5
sandye51, суть в том, чтобы интерпретировать унарный минус как отдельную операцию (возможно, при синтаксическом анализе заменять унарный минус на другой символ, например, на "_"), и считать набор _a неделимой лексемой, а вот уже при вычислении вспоминать, что на самом деле _a - это (-1) * a.
А вообще, насколько мне помнится, изначально ПолИЗ не позволяет вычислять выражения, содержащие унарные операции, поэтому, чтобы эту возможность ввести, приходится всячески исхитряться.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 18:39     Польская запись #6
silent_1991, ты не понял, я говорил чтобы всегда интерпретировать минус как унарную операцию. Но правильнее было бы вставлять 0, где это требуется (а именно в случаях, если минус стоит в начале выражения, либо перед открывающейся скобкой). Как по правилам арифметики, ведь -a изначает 0-a, но просто 0 опускается.
и никаких геморроев с _а не надо.
knkd
37 / 36 / 2
Регистрация: 08.08.2010
Сообщений: 162
23.12.2010, 18:49     Польская запись #7
А почему бы не отдельную операцию ± которая берёт со стека число, делает его отрицательным и возвращает обратно?
Получается: (a±b±-)
Хотя тогда (ab±±-) будет неправильным...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2010, 19:08     Польская запись
Еще ссылки по теме:

C++ Обратная польская запись
C++ Обратная Польская Запись
Префиксная польская запись C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.12.2010, 19:08     Польская запись #8
Ну так эта операция тоже будет унарной, её ПолИЗ также поддерживать не будет. А вообще я почти это и предлагал - ввести новое обозначение для унарного минуса. Я, когда реализовывал ОПЗ - так и делал.
Yandex
Объявления
23.12.2010, 19:08     Польская запись
Ответ Создать тему
Опции темы

Текущее время: 09:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru