栈的应用(二)-在前缀(后缀)表达式中求值

1. 后缀表达式(逆波兰表达式)

运算符在两个操作数后面
中缀转后缀的手算方法:
(1)确定中缀表达式的各个运算符的运算顺序
(2)选择下一个运算符,按照【左操作数 右操作数 运算符】的方式组合成一个新的操作数
(3)如果还有运算符没被处理,就继续(2)
注意:由于运算顺序不唯一,因此对应的后缀的表达式也不唯一
在这里插入图片描述
但对于计算机来进行转化的话,只会产生第一种结果,因为算法的确定性,一种输入只能产生一种输出。
计算机中缀转后缀的原则:左优先原则。
左优先原则:只要左边的运算符能先计算,就优先算左边的。
左优先原则例子
后缀表达式的计算(手算)
后缀表达式的计算方式(手算):从左往右扫描,当搜寻到第一个运算符时,就让运算符前面最近的两个操作数执行相应运算,合体为一个操作数,直至没有操作数结束。(注意:操作数是有先后顺序的)
后缀表达式的计算方式(机算)(对于计算机来说,后缀表达式更容易进行计算)
(1)从左往右扫描每一个元素,直至所有元素被扫描完毕。
(2)当扫描到操作数时,压入栈中;当扫描到运算符时,将最顶上的两个元素弹出栈外,并执行相应运算,运算结果压回栈顶,回到(1)。
注意:后缀表达式先弹出的是右操作数
一句话进行概括,就是当扫描到运算符时,弹出栈顶两个元素,先弹出的为右操作数,执行相应运算,并将结果重新压入栈中。
2. 前缀表达式(波兰表达式)
运算符在两个操作数前面

中缀转前缀的手算方法:
(1)确定中缀表达式的各个运算符的运算顺序
(2)选择下一个运算符,按照【运算符 左操作数 右操作数】的方式组合成一个新的操作数
(3)如果还有运算符没被处理,就继续(2)
计算机中缀转前缀的原则:右优先原则。
右优先原则:只要右边的运算符能先计算,就优先算右边的。
按照右优先原则,转化得到的前缀表达式的运算符从右到左依次生效的。
前缀表达式的计算方式(手算):从右往左扫描,当搜寻到第一个运算符时,就让运算符前面最近的两个操作数执行相应运算,合体为一个操作数,直至没有操作数结束。(注意:操作数是有先后顺序的)
前缀表达式的计算方式(机算)
(1)从右往左扫描每一个元素,直至所有元素被扫描完毕。
(2)当扫描到操作数时,压入栈中;当扫描到运算符时,将最顶上的两个元素弹出栈外,并执行相应运算,运算结果压回栈顶,回到(1)。
注意:前缀表达式先弹出的是左操作数

3.中缀表达式转后缀表达式(用栈实现)
在这里插入图片描述
步骤如下:
(1)遍历所有字符,当遇到操作数时,将其放入后缀运算符中;
(2)当遇到运算符时,当栈中为空时,将其放入栈中;当栈中不为空时,需要判断栈中的运算符与即将入栈的运算符的优先级,当栈中运算符优先级大于或等于该运算符,需要将其弹出,然后将该运算符压入栈中。
(此步背后的逻辑关系为,当栈中运算符比该运算符优先级相等或者更高时,按照左优先原则,应该栈中运算符先出)
(3)当遇上’(‘时,将其入栈;当遇上’)‘时,弹出栈中运算符直至到达’(‘。
(4)当所有操作数遍历完成之后,将栈中所有元素清空。

4.中缀表达式的计算(用栈实现)
中缀表达式计算 = 中缀转后缀 + 后缀表达式求值 两个算法的结合
具体步骤如下:
(1)初始化两个栈,操作数栈和运算符栈
(2)若扫描到操作数,压入操作数栈
(3)若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈顶元素并执行相应运算,运算结果再压回操作数栈)
简单想来,就是在中缀表达式转化为后缀表达式的过程中,将其中的操作数重新放置在一个栈中,当运算符栈弹出一个运算符时,操作数栈即弹出两个栈顶元素进行相应计算,然后重新压入栈中。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值