我们一般使用的表达式是中缀表达式即A+B这样的,后缀表达式就是另一种便于计算机计算的表达式。通过使中缀表达式成为一颗二叉树,中缀表达是二叉树的中序遍历。注意这个二叉树所有的双亲结点必须有两个孩子。这颗树的后序遍历就是后缀表达式。
首先介绍如何使用栈和后缀表达式计算表达式的值。
设置一个栈,顺序扫描后缀表达式,如果遇到操作数,就将操作数压入栈中。如果遇到操作符就从栈中弹出两个操作数,这个两个操作数后出来的操作前出来的。比如AB-,遇到A进栈,遇到B进栈,那么当遇到-号出栈时,应该做A-B的运算。这样一直顺序的扫描后,最后的结果就会唯一的在栈里。
中缀表达式转后缀表达式:
中缀表达式看成一个字符串,从左到右开始扫描中缀表达式;
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
比如(a+b)*c/d
根据上述算法得到的后缀表达式就是:ab+c*d/
手动计算的简化版:
按照运算的先后顺序把每一个运算都添加上括号。然后把每一个运算符都放在括号的右边。去掉括号就可以得到了。
比如(a+b)*c/d
可化为
第一步:(((a+b)*c)/d)
第二步:(((ab)+c)*d)/
第三步:ab+c*d/