题目将难度降低了。
从左到右计算就好,不用在乎四则运算法则。
开一个数字栈,一个符号栈。
遇到数字,直接进数字栈。
遇到左括号,直接进符号栈。
遇到+-*号,如果符号栈顶元素不是左括号,那么先update(把符号栈顶元素取出来,把数字栈顶两个数字取出来,算完把结果放回数字栈),然后再把符号放到符号栈。
遇到右括号,一直update,直到遇到左括号,然后把左括号pop掉。
处理完后还得update,直到符号栈没元素。
(没想到自己能写出来
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int maxn = 100000;
int n;
char str[maxn];
stack<int> num, opt;
/*
( 0
) 1
+ 2
- 3
* 4
*/
inline int get(int x, int y, int opt) {
if(opt == 2) return x + y;
if(opt == 3) return x - y;
if(opt == 4) return x * y;
}
inline void update() {
int x = num.top(); num.pop();
int y = num.top(); num.pop();
int op = opt.top(); opt.pop();
int ans = get(y, x, op);
num.push(ans);
}
int main() {
scanf("%s", str); n = strlen(str);
for(int i = 0; i < n; ) {
if(str[i] >= '0' && str[i] <= '9') {
int x = 0;
for(; i < n && str[i] >= '0' && str[i] <= '9'; i++) x = x * 10 + str[i] - '0';
num.push(x);
} else {
if(str[i] == '(') {
opt.push(0);
i++;
}
else if(str[i] == '+') {
if(!opt.empty() && opt.top() != 0) update();
opt.push(2);
i++;
}
else if(str[i] == '-') {
if(!opt.empty() && opt.top() != 0) update();
opt.push(3);
i++;
}
else if(str[i] == '*') {
if(!opt.empty() && opt.top() != 0) update();
opt.push(4);
i++;
}
else {
for(; opt.top() != 0; ) update();
opt.pop();
i++;
}
}
}
for(; !opt.empty(); ) update();
printf("%d\n", num.top());
return 0;
}