Учтите, что постфиксное выражение однозначно показывает порядок оценки. Например, инфиксное выражение a+b*c
становится abc*+
, а (a+b)*c
становится ab+c*
.
Если вы будете следовать оценке выражения вашего кода, вы увидите, что порядок оценки может быть представлен выражением postfix.
Вы можете изменить свой код так, чтобы он выводил постфиксное выражение одновременно с его оценкой. Основная идея заключается в том, что всякий раз, когда вы нажимаете операнд (число), вы также добавляете его в выражение postfix. И всякий раз, когда вы выполняете операцию, вы добавляете оператор к выражению постфикса. Скобки, конечно же, никогда не добавляются к постфиксу.
Итак, когда вы оцениваете (a+b)*c
, вы делаете следующее:
- Нажмите '(' на стек операторов.
- Вставьте «a» в стек операндов и добавьте «a» к своему выражению постфикса.
- Нажмите '+' на стек операторов.
- Вставьте 'b' в стек операндов и добавьте 'b' к своему выражению постфикса.
- Вы встречаете ')'. Извлеките «+» из стека операторов и добавьте к своему выражению постфикса. Извлеките «a» и «b» из стека операндов, выполните операцию и отправьте результат обратно в стек операторов.
- Нажмите '*' в стеке операторов.
- Нажмите 'c' в стеке операндов и добавьте к своему выражению постфикса.
- Ты в конце выражения. Вытяните '*' из стека операторов, добавьте к выражению постфикса, вытолкните операнды и оцените.
Вы сможете легко вносить эти изменения в свой код. Каждый раз, когда вы звоните numbers.push()
, также добавляйте номер к выражению вашего постфикса. Всякий раз, когда вы вызываете ops.pop()
, чтобы удалить оператор (не '('), добавьте оператор popped к вашему выражению postfix. Когда вы закончите оценку, выведите выражение postfix.