sdut原表达式转换为后缀表达式 原表达式转换为后缀表达式

原表达式转换为后缀表达式

为什么要转换

原表达式即中缀表达式是人最习以为常、是我们最容易接受的形式。如: 

A+B(CD)E/FA+B∗(C−D)−E/F

我们很容易就能理解表达式的数学含义,但是要把表达式丢给计算机去处理,它并不能像人一样有逻辑的去判断先处理哪一步,后处理哪一步,它只会严格的按照从左只有执行,因此为了符合计算机运行方式,必须把原表达式转换为对应的后缀表达式才行。

如何转换

1 【根据树的遍历】

这里写图片描述

根据原表达式的优先级,忽略括号的情况下,建立一个表达式树,根据树的后序遍历即可得到后缀表达式。这种方法直观,不容易出错。 

ABCD+EF/ABCD−∗+EF/−

2 【利用栈】

中缀表达式看成一个字符串,从左到右开始扫描中缀表达式;

1.遇到操作数:直接输出(添加到后缀表达式中) 
2.栈为空时,遇到运算符,直接入栈 
3.遇到左括号:将其入栈 
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,括号不输出。 
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 
6.最终将栈中的元素依次出栈,输出。

例如:(A+B*C)/D

这里写图片描述

3 【简化法】 
首先按照运算的先后顺序将表达式全部都添加上括号

(a+b)*c*(d-e/f)----> (((a+b)*c)*((d-(e/f))))
  • 1
  • 2

然后由于是后缀表达式,从里到外将所有运算符都拿到右括号的右边

(((ab)+c)*((d(ef)/)-))* 
  • 1
  • 2

最后再将所有括号都去掉

ab+c*def/-* 
  • 1
  • 2

同理,如果是变为前缀表达式的话,就把运算符拿到括号左边就可以啦

猜你喜欢

转载自blog.csdn.net/qq_41374539/article/details/80629819