📅  最后修改于: 2023-12-03 15:37:49.666000             🧑  作者: Mango
本文将介绍如何使用堆栈来计算后缀表达式的值。
后缀表达式,也称为逆波兰表达式(RPN),是一种使用后缀表示算法表示算术表达式的方法,其中运算符立即跟在其操作数之后。例如,“3+4”可以表示为“3 4 +”。
使用后缀表达式的优点在于,可以避免使用括号,因为操作的优先级由运算符的位置来决定。此外,计算后缀表达式的值可以使用堆栈。
后缀表达式: "5 1 2 + 4 * + 3 -"
使用堆栈的过程如下:
| 操作 | 栈的状态 | | -------- | -------- | | | | | | | | (初始化) | | | | | | | | | 5 | 5 | | 1 | 5, 1 | | 2 | 5, 1, 2 | | | 5, 3 | | | 20 | | 4 | 20, 4 | | | 80 | | + | 84 | | 3 | 84, 3 | | | 81 | | - | 81 |
因此,表达式的值为81。
以下是使用C++实现该算法的示例代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string str="5 1 2 + 4 * + 3 -";
stack<int>s;//定义数值堆栈
for(int i=0;i<str.length();i++){
if(str[i]==' '||str[i]==',')continue;//排除无用字符
else if(isdigit(str[i])){//如果遇到数字
int x=0;
while(isdigit(str[i])){//处理多位整数
x=x*10+str[i]-'0';
i++;
}
i--;
s.push(x);
}
else{//如果遇到操作符
int a,b;
a=s.top();
s.pop();
b=s.top();
s.pop();
if(str[i]=='+')s.push(a+b);//加法
else if(str[i]=='-')s.push(b-a);//减法
else if(str[i]=='*')s.push(a*b);//乘法
else s.push(b/a);//除法
}
}
cout<<s.top();//输出结果
return 0;
}