Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.61
NikITKA123
19 / 18 / 1
Регистрация: 28.04.2010
Сообщений: 86
#1

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

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

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

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

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

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

Обратная Польская Запись - C++
Сам вопрос: Я написал программу, она работает, но препод по Структурам данных сломал ее в два счета. Я нашел ошибку, но как ее исправить...

Обратная польская запись - C++
Подскажите, как по обратной польской записи выражения построить дерево выражения Например: дана запись 1 2 + 3 4...

Префиксная польская запись - C++
Здравствуйте, очень нужна помощь умных людей( Задача: Написать код для преобразования инфиксной записи выражения в префиксную, вообще нет...

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

Обратная польская запись - C++
Нужна помощь. Есть программа с общей польской записью. Программа принимает только буквенное выражение ( например: "a+b+c*d" и т.д), а...

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


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

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

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

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

Обратная польская запись - C++
Здравствуйте, изучаю обратную польскую запись, столкнулся с такой проблемой: Перерыл множество алгоритмов перевода из обычной записи в...

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

Обратная польская запись - C++
Нужно создать класс с++ для вычисления обратной польской записи с помощь стека.

Обратная польская запись. С++ - C++
Необхдимо дописать программу, что бы она работала с унарным минусом. Обратная польская запись, С++. #include &lt;iostream&gt; #include...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru