一般的做法就是搞两个栈,一个用来放运算符,一个用来放运算数。运算符不断对运算数操作,直到最后运算符全部操作完,运算数只剩下一个,就是答案。对应的辅助函数如下:
void eval(stack<int>& nums, stack<char> &op){
int b = nums.top();nums.pop();
int a = nums.top();nums.pop();
char c = op.top();op.pop();
int r;
if(c=='+') r = a+b;
else r = a-b;
nums.push(r);
}
处理规则如下:
遇到数字,完整解析后,压入数字栈
遇到(,直接入符号栈
遇到), 把之前的结果都算了,直到遇到(
遇到+或者-,直接入栈:
最后将没有算完的算完
class Solution {
public:
void eval(stack<int>& nums, stack<char> &op){
int b = nums.top();nums.pop();
int a = nums.top();nums.pop();
char c = op.top();op.pop();
int r;
if(c=='+') r = a+b;
else r = a-b;
nums.push(r);
}
int calculate(string s) {
stack<int> nums;
stack<char> op;
int n = s.size();
for(int i=0;i<n;i++){
char c = s[i];
if(c==' ') continue;
if(isdigit(c)){
int x = 0 , j = i;
while(j<n&&isdigit(s[j])){
x = x*10 + (s[j++]-'0');
}
nums.push(x);
i = j-1;
}else if(c=='('){
op.push(c);
}else if(c==')'){
while(op.top()!='(') eval(nums,op);
op.pop();
}else{
if(!op.empty()&&op.top()!='(') eval(nums,op);
op.push(c);
}
}
while(!op.empty()) eval(nums,op);
return nums.top();
}
};