大家都知道平时我们看到的计算式都是中序的,然而实际上由于运算符的优先级原因,计算机一般将中序表达式转成前序或者后序表达式来更有效率的计算。而在次过程中,需要用到栈来更好的处理
这里写一下中序变后序表达式的转化过程:
拿A+B-C/(D+E)为例子吧
1:我们将该式子依次扫描,如果是数字则直接输出,遇见运算符号则压入栈。此时这里读到A,输出A
2:读到+,压入+
3:读到B,输出B
4:读到-,对比栈此时最后一个运算符+,是同一优先级,然而+先于压入,要看做-优先级小于+,小于则需要输出
栈中的运算符再压入,也即这里输出+(栈弹出),并向栈压入-
5:读到C,输出C
6:读到/,此时栈中只有-,/运算符优先级比-高,则直接将/压入栈即可
7:读到(,左括号则直接压入栈中
8:读到D,输出D
9:读到+,直接压入+,(这里需要注意如果栈顶是“(”,则直接压入运算符号)
10:读到E,输出E
11:读到),右括号此时先依次输出栈中和(之间的运算符,然后在依次输出(即左括号之前的运算符。也即此时
输出+,/,-
总体输出为:AB+CDE+/-
-----------------------------------------------------------------------------------------------------------------------------------------
运算过程:
对于上诉输出的AB+CDE+/-的运算也很简单:
对后序表达式依次扫描。遇到数字压入栈中。遇见运算符号,则取出栈中最后两个数字并计算,得到结果压入栈中
即可。
1 栈存入AB,读到+,取出A,B计算结果O进栈,此时栈为O
2 继续依次存入CDE读到+,取出DE计算,结果P进栈,此时栈为O,C,P
3 读到/,取出C,P,计算结果Q进栈,此时栈为O,Q
4 读到-,取出O,Q,计算结果得到M
5 扫描完毕,输出栈中结果,完毕