Обратная польская запись (ОПЗ) — это форма записи математических выражений, в которой операторы располагаются после своих операндов. Для выполнения обратного преобразования из ОПЗ в обычную математическую запись (ОМЗ) мы можем использовать стек.
Шаги преобразования из ОПЗ в ОМЗ:
1. Создайте пустой стек для хранения операторов.
2. Прочтите ОПЗ слева направо.
3. Если текущий токен является операндом, добавьте его в выражение в ОМЗ.
4. Если текущий токен является оператором,
4.1. Пока стек не пуст и верхний оператор в стеке имеет больший или равный приоритет операции, чем текущий оператор,
4.1.1. Удалите оператор из стека и добавьте его в выражение в ОМЗ.
4.2. Положите текущий оператор в стек.
5. Если текущий токен является открывающей скобкой, положите его в стек.
6. Если текущий токен является закрывающей скобкой,
6.1. Пока вершина стека не станет открывающей скобкой,
6.1.1. Удалите операторы из стека и добавьте их в выражение в ОМЗ.
6.2. Удалите открывающую скобку из стека.
7. Пока стек не пуст, добавьте операторы из стека в выражение в ОМЗ.
8. Полученное выражение в ОМЗ будет результатом преобразования из ОПЗ.
Пример:
Вход: “5 3 4 * + 2 -”
Выход: “(5 + (3 * 4)) – 2”
1. Создаем пустой стек.
2. Читаем “5”, это операнд, добавляем его в выражение: “5”.
3. Читаем “3”, это операнд, добавляем его в выражение: “5 3”.
4. Читаем “4”, это операнд, добавляем его в выражение: “5 3 4”.
5. Читаем “*”, это оператор. Вершина стека пуста, положим “*” в стек.
6. Читаем “+”, это оператор. Вершина стека содержит “*”, которое имеет больший приоритет операции.
Удаляем “*” из стека и добавляем его в выражение: “5 3 4 *”. Положим “+” в стек.
7. Читаем “2”, это операнд, добавляем его в выражение: “5 3 4 * 2”.
8. Читаем “-“, это оператор. Вершина стека содержит “+”, которое имеет больший приоритет операции.
Удаляем “+” из стека и добавляем его в выражение: “5 3 4 * 2 +”. Положим “-” в стек.
9. Конец входной строки. Удаляем все операторы из стека и добавляем их в выражение: “5 3 4 * 2 + -“.
10. Полученное выражение “(5 + (3 * 4)) – 2” является результатом преобразования из ОПЗ в ОМЗ.