后缀表达式
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:
3*(5-2)+7
\texttt{3*(5-2)+7}
3*(5-2)+7 对应的后缀表达式为:
3.5.2.-*7.+@
\texttt{3.5.2.-*7.+@}
3.5.2.-*7.+@。在该式中,@
为表达式的结束符号。.
为操作数的结束符号。
输入格式
输入一行一个字符串 s s s,表示后缀表达式。
输出格式
输出一个整数,表示表达式的值。
样例 #1
样例输入 #1
3.5.2.-*7.+@
样例输出 #1
16
提示
数据保证, 1 ≤ ∣ s ∣ ≤ 50 1 \leq |s| \leq 50 1≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 1 0 9 10^9 109。
注意事项
- 要枚举四种符号
- 并不是所有数都是一位数
C++代码
#include<bits/stdc++.h>
using namespace std;
int go(int a, int b, char c) {
if (c == '*') {
return a * b;
}
if (c == '/') {
return a / b;
}
if (c == '+') {
return a + b;
}
if (c == '-') {
return a - b;
}
}
int c(string a) {
stack<int> stk;
for (int i = 0; i < a.length(); i++) {
char c = a[i];
if (c == '@') {
break;
}
if (isdigit(c)) {
int v = c - '0';
while (isdigit(a[++i])) {
v = 10 * v + (a[i] - '0');
}
stk.push(v);
} else {
int a, b, x;
b = stk.top();
stk.pop();
a = stk.top();
stk.pop();
x = go(a, b, c);
stk.push(x);
}
}
return stk.top();
}
int main() {
string a;
cin >> a;
int b = c(a);
cout << b;
return 0;
}