题目地址:
https://www.luogu.com.cn/problem/P1449
题目描述:
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。如:3*(5–2)+7
对应的后缀表达式为:3.5.2.-*7.+@
。’@’
为表达式的结束符号。‘.’
为操作数的结束符号。
输入格式:
输入:后缀表达式
输出格式:
输出:表达式的值
数据范围:
字符串长度在
1000
1000
1000以内。
经典的逆波兰表达式求值,可以用栈来做。严格证明见https://blog.csdn.net/qq_46105170/article/details/103933010。代码如下:
#include <iostream>
#include <stack>
using namespace std;
int main() {
stack<int> stk;
int x = 0;
char ch;
while (scanf("%c", &ch), ch != '@') {
if (isdigit(ch)) x = x * 10 + ch - '0';
else if (ch == '.') {
stk.push(x);
x = 0;
} else {
int b = stk.top(); stk.pop();
int a = stk.top(); stk.pop();
switch (ch) {
case '+': stk.push(a + b); break;
case '-': stk.push(a - b); break;
case '*': stk.push(a * b); break;
case '/': stk.push(a / b); break;
}
}
}
cout << stk.top() << endl;
return 0;
}
时空复杂度 O ( n ) O(n) O(n), n n n为表达式长度。