题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入输出格式
输入格式:
输入:后缀表达式
输出格式:
输出:表达式的值
输入输出样例
输入样例#1: 复制
3.5.2.-*7.+@
输出样例#1: 复制
16
说明
字符串长度,1000内。
本题就是对栈的操作;
压入栈顶然后压出;
#include <bits/stdc++.h>
#define maxn 200005
typedef long long ll;
using namespace std;
stack<ll>k;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
string s;
cin >> s;
ll m = s.length();
ll t = 0,x = 0,y = 0,flag = 0;
for(int i = 0; i < m; i ++)
{
if(s[i] == '@')break;
t = 0;
while(s[i] >= '0' && s[i] <= '9')
{
t = t * 10 + (s[i] - '0');
i++;
flag = 1;
}
if(flag == 1){k.push(t);flag = 0;}
if(s[i] == '/')
{
x = k.top();
k.pop();
y = k.top();
k.pop();
y = y / x;
k.push(y);
}
else if(s[i] == '*')
{
x = k.top();
k.pop();
y = k.top();
k.pop();
y = y * x;
k.push(y);
}
else if(s[i] == '-')
{
x = k.top();
k.pop();
y = k.top();
k.pop();
y = y - x;
k.push(y);
}
else if(s[i] == '+')
{
x = k.top();
k.pop();
y = k.top();
k.pop();
y = y + x;
k.push(y);
}
}
ll result = k.top();
cout << result << endl;
return 0;
}