Note:
这是一个模板 开两个栈,一个计数 一个记操作符
每次是数字就直接进栈
如果是操作符,就判断当前操作符和栈顶的操作符,如果栈顶的操作符优先级大于等于当前操作符,就while 去执行计算操作,然后再判断栈顶操作符和当前操作符
否则就把当前操作符压入栈中
走到最后,如果栈不空,就一直计算 算到栈空
最后栈顶就是答案
模板还有处理括号的版本,就是遇到左括号直接进站,如果是有括号了,就开始进行计算,算到左括号
代码如下:
class Solution {
public:
stack<int> num;
stack<char> op;
void eval(){
int b = num.top(); num.pop();
int a = num.top(); num.pop();
char option = op.top(); op.pop();
int r;
if(option == '+') r = a + b;
else if(option == '-') r = a - b;
else if(option == '*') r = a * b;
else if(option == '/') r = a / b;
num.push(r);
}
int calculate(string s) {
unordered_map<char, int> pr;
pr['+'] = pr['-'] = 1, pr['*'] = pr['/'] = 2;
for(int i = 0; i < s.size(); i ++){
char c = s[i];
if(c == ' ') continue;
if(isdigit(c)){
int n = 0, j = i;
while(j < s.size() && isdigit(s[j]))
n = n * 10 + (s[j ++] - '0');
i = j - 1;
num.push(n);
}else {
while(op.size() && pr[op.top()] >= pr[c]) eval();
op.push(c);
}
}
while(op.size()) eval();
return num.top();
}
};