为什么要转换
原表达式即中缀表达式是人最习以为常、是我们最容易接受的形式。如:
A+B∗(C−D)−E/F
A
+
B
∗
(
C
−
D
)
−
E
/
F
我们很容易就能理解表达式的数学含义,但是要把表达式丢给计算机去处理,它并不能像人一样有逻辑的去判断先处理哪一步,后处理哪一步,它只会严格的按照从左只有执行,因此为了符合计算机运行方式,必须把原表达式转换为对应的后缀表达式才行。
如何转换
1 【根据树的遍历】
根据原表达式的优先级,忽略括号的情况下,建立一个表达式树,根据树的后序遍历即可得到后缀表达式。这种方法直观,不容易出错。
ABCD−∗+EF/−
A
B
C
D
−
∗
+
E
F
/
−
2 【利用栈】
中缀表达式看成一个字符串,从左到右开始扫描中缀表达式;
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。
例如:(A+B*C)/D
3 【简化法】
首先按照运算的先后顺序将表达式全部都添加上括号
(a+b)*c*(d-e/f)----> (((a+b)*c)*((d-(e/f))))
然后由于是后缀表达式,从里到外将所有运算符都拿到右括号的右边
(((ab)+c)*((d(ef)/)-))*
最后再将所有括号都去掉
ab+c*def/-*
同理,如果是变为前缀表达式的话,就把运算符拿到括号左边就可以啦