堆栈经典应用:表达式求值、后缀表达式

引言
表达式求值的思路可以是直接处理中缀表达式,也可以采用后缀表达式进行转换求值,这篇文章将按照以下思路:
优先级的概念
->什么是中缀后缀表达式
->后缀表达式的优点
->中缀表达式如何转换为后缀表达式
->后缀表达式的运算
->具体代码实现

优先级
表达式求值是一个数据结构中的经典问题,要求对表达式中的运算优先级不能忽略,在此现规定运算符的优先级如下:
*’ ‘/’ > ‘+’ ‘-’ > ‘(’ ‘)
即乘除大于加减,加减大于左右括号

什么是后缀表达式?
例如:1+2*3,是我们常见的表达式,称为中缀表达式,而与之对应的后缀表达式是123*+。 这种将运算符置于操作数其后的表达式称作后缀表达式,具体运算为:每当遇到一个运算符就取运算符前两个数进行运算。

后缀表达式的好处
例如常见的一个中缀表达式:
(a+b)*c+d/(e+c)
其对应的后缀表达式为
ab+c*dec+/+
可以发现后缀表达式能够忽略括号,减少运算的复杂度,且结合运用堆栈能够很好地计算出结果

中缀表达式如何转后缀表达式?
按照以下规则从前向后可以得到对应的后缀表达式:
1、遇到数字直接加入后缀表达式。
2、遇到空栈则直接入栈。
3、遇到运算符’(‘,直接入栈。
4、遇到运算符’)’,不断弹栈直到遇到’(‘,但’(‘和’)’都不能加入表达式。
5、其它运算符的优先级若比栈顶运算小,则弹出栈顶符号加入到后缀表达式中,并再次比较栈顶元素。

后缀表达式的运算
其实运算规则在前文已经提到了:每遇到一个操作符就取其前的两个操作数进行运算,例如在后缀表达式31+2*2/中:
第一步遇到+ 计算结果 42*2/
第一步遇到* 计算结果 82/
第一步遇到/ 计算结果 4

具体代码实现

#include<iostream>
#include<string>
#include<stack>
using namespace std;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值