题目描述
从键盘读入一个后缀表达式(字符串),只含有 0 ~ 9 组成的运算数及加 +
、减 —
、乘 *
、除 /
四种运算符。
每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以 @
作为结束标志。
比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,在字符数组 A 中的形式为:
栈中的变化情况:
运行结果:-47
提示:输入字符串长度小于 250,参与运算的整数及结果之绝对值均在 264 范围内,如有除法保证能整除。
输入格式
一个后缀表达式。
输出格式
一个后缀表达式的值。
输入样例
16 9 4 3 +*-@
输出样例
-47
题解
stack:
坑点
:数据中可能含有多个 @
,所以遇到 @
要立即结束运算;
#include <iostream>
#include <stack>
using namespace std;
typedef long long LL;
stack<LL> stk;
void cal(char c)
{
LL b = stk.top(); stk.pop();
LL a = stk.top(); stk.pop();
if(c == '+') stk.push(a + b);
if(c == '-') stk.push(a - b);
if(c == '*') stk.push(a * b);
if(c == '/') stk.push(a / b);
}
int main()
{
string s;
getline(cin, s);
LL num = 0;
for (int i = 0; i < s.size(); i ++)
{
if(s[i] >= '0' && s[i] <= '9') num = num * 10 + s[i] - '0';
else if(s[i] == ' ') stk.push(num), num = 0;
else if(s[i] != '@') cal(s[i]);
else break;
}
cout << stk.top() << endl;
return 0;
}