引言
表达式求值的思路可以是直接处理中缀表达式,也可以采用后缀表达式进行转换求值,这篇文章将按照以下思路:
优先级的概念
->什么是中缀后缀表达式
->后缀表达式的优点
->中缀表达式如何转换为后缀表达式
->后缀表达式的运算
->具体代码实现
优先级
表达式求值是一个数据结构中的经典问题,要求对表达式中的运算优先级不能忽略,在此现规定运算符的优先级如下:
‘*’ ‘/’ > ‘+’ ‘-’ > ‘(’ ‘)’
即乘除大于加减,加减大于左右括号
什么是后缀表达式?
例如: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;