前缀表达式与后缀表达式

前缀表达式与后缀表达式都可以由中缀表达式来转换而成,由于在转化的过程中已经考虑了优先级,所以前缀表达式和后缀表达式的求值直接借助栈就可以,不再有优先级的规则。

中缀表达式转换为前缀表达式和后缀表达式都借助栈来完成。

转换时,运算符压栈,数字直接输出。求值时,数字压栈。

原理:

1、中缀形式的四则运算,相同等级的,总是从前往后计算。

2、无论是前缀表达式还是后缀表达式求值,最先扫描到的运算符肯定是最先求值的。所以,在中缀转换成前缀和后边表达式时,运算符的优先级越高,必须越早从栈中弹出,先弹出的在求值时,必定时先被扫描到的,也就会先计算。

3、一个事实:当前运算符(当前扫描到的运算符)不能直接输出,输出的只能是栈顶的运算符。

操作:

中缀转后缀表达式时和后缀的求值时,都是从前往后扫描,所以转换时,只要栈顶的比当前的运算符优先级高,需要弹出;等于的,由于在当前运算符的左边,左边意味着先计算,也需要弹出。然后,将当前的运算符压栈。最后需要将运算符栈中剩余的全部弹出加入到输出。

中缀转前缀和前缀表达式的求值时,都是从后往前扫描,所以转换时,只有栈顶的比当前的高,才需要弹出;等于的,由于在当前运算符的后边(意味着后计算),所以不能弹出。然后,将当前运算符压栈。最后,将运算符栈中剩余的全部弹出加入到输出中。还需要一步,将输出逆序。


example:

3+4*1-2

即 ((3+(4*1))-2)

后缀 3 4 1 * + 2 -

前缀 - + 3 * 4 1 2

中缀转前缀,逆序之前,得到的表达式为 2 1 4 * 3 + -  ,这个表达式,也是前缀表达式求值时,扫描的顺序。由于转换的最后一步的逆序操作,所以求值扫描时,仍然需要从后往前扫描。

中缀转后缀,输出可以直接到队列当中,即是最后的结果。

中缀转前缀,由于最后需要逆序,所以转换过程当中,除了符号栈之外,输出到另一个栈当中,最后从此栈中弹出所有达到逆序的效果。

求值时,前缀表达式扫描到运算符时,从栈中弹出两个操作数,先弹出的操作数放在运算符的左边(先弹出的后压栈,意味着后扫描到,因为是从后往前扫描,也就是在前边)

后缀表达式求值时,扫描到运算符,从栈中弹出两个操作数,后弹出的操作数放在运算符的左边(后弹出的先压栈,意味着先扫描到,因为从前往后扫描,也就在前边)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值