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

https://blog.csdn.net/summerxiachen/article/details/77073320/

为什么要转换

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

A+B∗(C−D)−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

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

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

最后再将所有括号都去掉

ab+c*def/-* 
  • 1

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

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值