前中后缀表达式的转换与运算——数据库系统工程师(每日一题1.31)

前言

程序语言中,表达式主要分为三种

  • 前缀表达式:也被称为波兰表示法,其特点是将操作符置于操作数之前,如∶-×+3456。

  • 中缀表达式:即我们常用的表示方法,(3 + 4)× 5-6。

  • 后缀表达式:又被称为逆波兰法,其特点是将操作符置于操作数之后,34+5 × 6-。

前缀表达式

从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素op次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。例如前缀表达式“- ×+ 3456”:

我们先从右至左扫描表达式,把6,5,4,3依此压入栈中,扫描到第一个运算符+时,将栈顶的3,4弹栈进行运算,3+4=7,再将7压入栈中,此时栈中还有6,5,7三个数字。接下来扫描到第二个运算符x时,弹出栈顶前两个数,即7x5=35,再将35压入栈中,此时栈中还有6,35两个数字,最后扫描最后一个运算符-,弹出栈顶前两个数,35-6=29,即结果为:29。(注意栈顶元素在运算符左边)

中缀表达式

中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。

虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。

例如:(3 + 4)× 5-6=29,我们口算即得出结果,单对于计算机而言却十分复杂。

后缀表达式

与前缀表达式类似,只是顺序是从左至右.

从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素op栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。例如后缀表达式“3 4+5× 6-":

我们从左至右扫描表达式,先将3,4压栈,当扫描到第一个运算符+时,弹栈栈顶前两个数,3+4=7,7压栈,扫描到5,5压栈,当扫描到x时,弹栈栈顶前两个数,5x7=35,再将35压栈,扫描到6,6压栈,当扫描到最后一个运算符-时,弹栈栈顶前两个数,35-6=29,即结果为29。(注意栈顶元素在运算符右边)

例题

算数表达式(a-b)xc+d的前缀表达式和后缀表达式分别为:

前缀表达式:先将(a-b)转换为-ab,再将-ab看作一个整体,(-ab)xc转换为x-abc,再将x-abc看作一个整体(x-abc)+d转换为+x-abcd,即前缀表达式为+x-abcd.

我们可以验证一下:从右至左扫描,将d,c,b,a压栈,此时栈中有a,b,c,d四个运算数(a为栈顶元素),当扫描到第一个运算符-时,弹出栈顶前两个数,进行运算,a-b,再将结果压栈,此时栈中有(a-b),c,d当扫描到第二个运算符x时,弹出前两个栈,进行运算(a-b)xc,再将结果压栈,此时栈中(a-b)xc,d,当扫描到最后一个运算符+时,进行运算,(a-b)xc+d,与原式相同,验证结束。

后缀表达式:与前缀表达式相反,先将(a-b)转换为ab-,再将ab-看作一个整体,(ab-)xc转换为ab-cx,再将ab-cx看作一个整体(ab-cx)+d转换为ab-cxd+,即后缀表达式为ab-cxd+.结果验证与前缀表达式相反,从左至右扫描。验证过程留给你思考,就不再验证。

结语

表达式运算及转换都用到了栈的思想,只要对栈有充分的了解就很容易算出答案,目前我还在数据库系统工程师备考学习阶段,欢迎大佬指正,感谢大家的支持。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值