数据结构与算法:栈的应用——表达式求值

一. 中缀表达式转前,后缀表达式(手算)

 

1. 首先按照四则运算法则确定操作符的生效顺序,但是需要注意的是左优先原则,即在四则运算中左右操作符先对哪一个进行操作不影响其结果时,在转化后缀表达式时,先考虑左操作符

2. 按照[左操作数 右操作数 运算符] 的形式组合成一个新的操作数

3. 如果还有操作数没有处理,重复2,最终结果如下:

同理,我们可以尝试将其转化为前缀表达式:

一个易错案例:即转化后缀表达式时先考虑左操作符的问题:

首先,根据左优先原则,先考虑A+B之间的“+”,而不是C*D之间的“*”,先考虑B和C之间的“-”,而不是E和F之间的“+”

二. 中缀表达式转后缀表达式(机算)

依然是利用了辅助栈来实现,只不过与后缀表达式转中缀表达式的辅助栈不同的是,这个栈存储的是未知位置的运算符。首先,我们依次从左到右遍历序列

1. 如果遇见操作数,直接输出作为后缀表达式的一部分

2. 如果遇见运算符,入栈,如果当前栈顶运算符的优先级高于或等于当前入栈的运算符优先级,那么栈顶运算符出栈进入表达式,当前运算符入栈,然后继续判断当前栈顶运算符的优先级......

3. 如果遇见左括号,直接入栈,如果遇见右括号,则依次弹出栈内直到左括号之间的运算符,但是需要注意的是,左右括号弹栈后不需要加入后缀表达式,因为后缀表达式中本身就不存在左右括号

下面是一个例题:

再看一个例题:

 

三. 后缀表达式,前缀表达式转中缀表达式(手算,机算)

1. 前缀表达式的手算方法:

从右往左扫描,每遇到两个操作数和一个操作符,就将其进行合并,即由原来的前缀表达式转化为中缀表达式

2. 前缀表达式的机算方法:

思想类似,只是这里借助了辅助栈来进行操作,同样是从右往左扫描,遇到操作数则操作数进栈,遇到操作符,则栈内的最顶部的两个操作数与操作符进行合并,且合并后的中缀式中靠左的位置是原栈顶元素,合并完成后,入栈作为一个新的元素等待下一次的合并

3. 后缀表达式的手算方法:

从左往右扫描,每遇到两个操作数和一个操作符,就将其进行合并,即由原来的后缀表达式转化为中缀表达式

4. 后缀表达式的机算方法:

 思想类似,只是这里借助了辅助栈来进行操作,同样是从左往右扫描,遇到操作数则操作数进栈,遇到操作符,则栈内的最顶部的两个操作数与操作符进行合并,且合并后的中缀式中靠右的位置是原栈顶元素,合并完成后,入栈作为一个新的元素等待下一次的合并

四. 中缀表达式的计算(机算)

需要借助两个辅助栈来实现,其中第一个辅助栈用于存放运算符,另一个辅助栈用于存放操作数,中缀表达式机算的思想是转中缀表达式以及中缀表达式转后缀表达式思想的一个结合

1. 如果遇见运算符,那么运算符入栈,如果当前栈顶运算符的优先级大于等于将入栈的运算符优先级,那么栈顶运算符出栈,并与存储操作数的栈中栈顶元素及第二个元素进行合并

2. 如果遇见操作数,操作数直接入栈,当两个操作数与运算符进行合并操作后,合并操作完成后的表达式入栈

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值