后缀(逆波兰)表示法:一种不需要括号的后缀表示法,所有运算符都是在要运算数字的后面,比如后缀表达式 9 3 1 - 3 * + 10 2 / +
就是中缀表达式 9 + (3 - 1) × 3 + 10 / 2
后缀表达式可以用栈来实现
规则:创建一个空栈,把后缀表达式依次进栈,要求遇到数字就进栈,遇到符号就将栈顶的两个数字依次出栈,进行运算后,运算结果进栈,直到获得最终结果。
画图举例:9 3 1 - 3 * + 10 2 / +
第一步:9 3 1 依次进栈
第二步:遇到 ' - ' ,1出栈作为减数,3作为被减数,运算 3 - 1,得到 2,将2进栈。
第三步:3进栈
第四步:遇到 ' * ',3和2依次出栈,运算2*3得6,将6进栈。
第五步:遇到 ' + ',6和9依次出栈,运算9+6=15,将15进栈。
第六步:10和2依次进栈。
第七步:遇到 ' / ',2和10依次出栈,运算10/2=5,将5进栈。
第八步:遇到 ' + ',5和15依次出栈,运算15+5=20,将20进栈。
第九步:最终结果出栈,栈变空。
最后再来验证一下9 + (3 - 1) × 3 + 10 / 2
=9+6+5=20。运算正确!
中缀表达式转化为后缀表达式的规则也可以使用栈来实现。
例如9 + (3 - 1) × 3 + 10 / 2,
规则如下:
从左到右遍历中缀表达式,遇到数字输出数字,遇到运算符,若该运算符的优先级比栈顶的运算符优先级低,则栈顶元素出栈并输出,然后该元素进栈,否则该运算符直接进栈(乘除大于加减)。或者遇到右括号,则从栈顶元素依次出栈,直到遇到左括号(左括号也出栈),但括号只出栈,不输出。
第一步:输出9,+ 进栈。 9
第二步:( 进栈,输出3。 9 3
第三步:' - ' 进栈,输出1。9 3 1
第四步:- 出栈,)进栈,输出 - ,()也出栈,不输出。 9 3 1 -
第五步:*进栈,输出3。 9 3 1 - 3
第六步:*出栈,+出栈,+进栈,输出10。
+优先级最低。
9 3 1 - 3 * + 10
第七步:/ 进栈,输出2。9 3 1 - 3 * + 10 2
第八步:/和+依次出栈。9 3 1 - 3 * + 10 2 / +
总结:想让计算机具有处理中缀表达式的能力,最重要的有两步:
1.将中缀表达式转换为后缀表达式
(栈用来进出运算符)
2.将后缀表达式转换为中缀表达式
(栈用来进出数字)