Обратная польская запись
С помощью данного сервиса можно онлайн получить обратную польскую запись.Инструкция
Для арифметических выражений
Все математические операции выражаются через общепринятые символы (+ , - , * , / , ^ ).Для логических выражений
! Отрицание (НЕ)| Штрих Шеффера (И-НЕ)
# Стрелка Пирса (ИЛИ-НЕ)
* Конъюнкция (И)
+ Дизъюнкция (ИЛИ)
^ Исключающее ИЛИ, сумма по модулю 2 (XOR)
@ Импликация (ЕСЛИ-ТО)
% Обратная импликация
= Эквивалентность (РАВНО)
Если в качестве исходных данных задана уже готовая обратная польская запись, то необходимо отметить этот пункт. В этом случае все символы разделяются пробелом.
Например, x y z ! * x + z * +
Алгоритм разбора выражений
- Предварительная обработка символьной строки (проверка на наличие ошибок, сокращение выражения).
- Пока есть ещё символы для чтения:
- Читаем очередной символ.
- Если символ является числом или постфиксной функцией (например, ! — факториал), добавляем его к выходной строке.
- Если символ является префиксной функцией (например, sin — синус), помещаем его в стек.
- Если символ является открывающей скобкой, помещаем его в стек.
- Если символ является закрывающей скобкой:
- До тех пор, пока верхним элементом стека не станет открывающая скобка, выталкиваем элементы из стека в выходную строку. При этом открывающая скобка удаляется из стека, но в выходную строку не добавляется.
- Если существуют разные виды скобок, появление непарной скобки также свидетельствует об ошибке. Если какие-то скобки одновременно являются функциями (например, [x] — целая часть), добавляем к выходной строке символ этой функции.
- Если символ является бинарной операцией о1, тогда:
- пока на вершине стека префиксная функция…
- ИЛИ операция на вершине стека приоритетнее o1;
- ИЛИ операция на вершине стека левоассоциативная с приоритетом как у o1;
- выталкиваем верхний элемент стека в выходную строку.
- помещаем операцию o1 в стек.
- пока на вершине стека префиксная функция…
- Когда все символы входной строки пере, выталкиваем все символы из стека в выходную строку.
- высокий: ^
- средний: * /
- низкий: + −
- самый низкий: ( )
Пример разбора арифметического выражения
sqrt(x)-1/2*sin(x^2-2)Символ | Операция | Стек | Выходная строка |
sqrt | поместить в стек | s | |
( | поместить в стек | s, ( | |
x | добавить к выходной строке | s, ( | x |
) | 1) присоединить содержимое стека до скобки в обратном порядке к выходной строке; 2) удалить скобку из стека. | s | x |
- | 1) присоединить стек в обратном порядке к выходной строке; 2) поместить новую операцию в стек. | - | x, sqrt |
1 | добавить к выходной строке | - | x, sqrt, 1 |
/ | поместить в стек | -, / | x, sqrt, 1 |
2 | добавить к выходной строке | -, / | x, sqrt, 1, 2 |
* | 1) присоединить стек в обратном порядке к выходной строке; 2) поместить новую операцию в стек. | -, * | x, sqrt, 1, 2, / |
sin | поместить в стек | -, *, s | x, sqrt, 1, 2, / |
( | поместить в стек | -, *, s, ( | x, sqrt, 1, 2, / |
x | добавить к выходной строке | -, *, s, ( | x, sqrt, 1, 2, /, x |
^ | поместить в стек | -, *, s, (, ^ | x, sqrt, 1, 2, /, x |
2 | добавить к выходной строке | -, *, s, (, ^ | x, sqrt, 1, 2, /, x, 2 |
- | 1) присоединить стек в обратном порядке к выходной строке; 2) поместить новую операцию в стек. | -, *, s, (, - | x, sqrt, 1, 2, /, x, 2, ^ |
2 | добавить к выходной строке | -, *, s, (, - | x, sqrt, 1, 2, /, x, 2, ^, 2 |
) | 1) присоединить содержимое стека до скобки в обратном порядке к выходной строке; 2) удалить скобку из стека. | -, *, s | x, sqrt, 1, 2, /, x, 2, ^, 2, - |
Пример разбора логического выражения
x+(y*!z+x)*zСимвол | Операция | Стек | Выходная строка |
x | добавить к выходной строке | x | |
+ | поместить в стек | + | x |
( | поместить в стек | +, ( | x |
y | добавить к выходной строке | +, ( | x, y |
* | поместить в стек | +, (, * | x, y |
! | поместить в стек | +, (, *, ! | x, y |
z | добавить к выходной строке | +, (, *, ! | x, y, z |
+ | 1) присоединить стек в обратном порядке к выходной строке; 2) поместить новую операцию в стек. | +, (, + | x, y, z, !, * |
x | добавить к выходной строке | +, (, + | x, y, z, !, *, x |
) | 1) присоединить содержимое стека до скобки в обратном порядке к выходной строке; 2) удалить скобку из стека. | + | x, y, z, !, *, x, + |
* | поместить в стек | +, * | x, y, z, !, *, x, + |
z | добавить к выходной строке | +, * | x, y, z, !, *, x, +, z |