记住两条规则
- 从左到右遍历中缀表达式的每个数字和符号,若是数字就输出
- 若是符号,判断其与栈顶符号的优先级,是右括号或者优先级小于等于栈顶元素,栈顶元素依次出栈并输出,最后将当前符号进栈
举例
中缀表达式
9+(3-1)×3+10÷2
后缀表达式:
9 3 1 - 3 * + 10 2 / +
大家可以自行推导一遍,不正确可以参考我下面的步骤
推导步骤
第一步 9+(3-1)×3+10÷2
输出:9
栈里面情况:
+
第二步 ( 3-1)×3+10÷2
输出:9
栈里面情况:
(
+
第三步 3-1)×3+10÷2
输出:9 3
栈里面情况:
(
+
第四步 -1)×3+10÷2
输出:9 3
栈里面情况:
-
(
+
第五步 1)×3+10÷2
输出:9 3 1
栈里面情况:
-
(
+
第六步 )×3+10÷2
此时遇到右括号,假如入栈(-),栈中的-输出
输出:9 3 1 -
栈里面情况:
+
第七步 ×3+10÷2
输出:9 3 1 -
栈里面情况:
×
+
第八步 3+10÷2
输出:9 3 1 - 3
栈里面情况:
×
+
第九步 +10÷2
此时加号的优先级不高于栈顶的×号,输出×;
再次判断栈顶为+,+号同样是不高于此时栈顶的+号,输出+;
此+号入栈
输出:9 3 1 - 3 × +
栈里面情况:
+
第十步 10÷2
输出:9 3 1 - 3 × + 10
栈里面情况:
+
第十步 ÷2
输出:9 3 1 - 3 × + 10
栈里面情况:
÷
+
第十一步 2
输出:9 3 1 - 3 × + 10 2
栈里面情况:
÷
+
第十二步 符号出栈
输出:9 3 1 - 3 × + 10 2 ÷ +
栈里面情况:
最后输出是:9 3 1 - 3 * + 10 2 / +