题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
输入输出样例
输入
3.5.2.-*7.+@
输出
16
很好理解,遇到数字入栈,遇到符号弹栈运算,将计算后的数字入栈
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1010;
int st[N], tt=-1, m;//tt头指针从-1开始,m用来存放当前未扫描完的数
char p[N];
int main()
{
cin >> p;
for (int i = 0; p[i] != '@'; i++)
{
if (p[i] == '.') { st[++tt] = m; m = 0; continue; };//读到‘.'入栈
if (p[i] - '0' >= 0 && p[i] - '0' <= 9)m=m*10+p[i]-'0';
else
{
int a, b;
b = st[tt]; tt--;//这里需要注意后入栈的为第二个操作数
a = st[tt]; tt--;
switch (p[i])
{
case '*':st[++tt] = a * b; break;
case '+':st[++tt] = a + b; break;
case '-':st[++tt] = a - b; break;
case '/':st[++tt] = a / b; break;
default:
break;
}
}
}
printf("%d", st[tt]);//输出栈顶元素
return 0;
}