这道题给出一个表达式,要求计算表达式的结果。表达式有括号,有加减号。
一开始想的方法是,碰到数字,加号,减号,左括号就入栈。遇到右括号,一个一个弹出来,直到弹到了左括号,然后把当前结果入栈,继续遍历字符串压压压。但是写起来发现太麻烦了,肯定不是这样,看了别人的解答果然容易很多。
这道题的难点在于两个,一个是括号怎么处理,一个是有括号的情况下加减号怎么处理。
因为我们是顺序读字符串,所以处理操作符最方便的方法就是设定一个变量来记录上一个操作符是什么。在这里用int型变量,这样的话直接用int型操作符(1和-1表示加和减)乘以后面读到的数就可以。遇到左括号,说明我现在要计算一个单独的括号里的结果,括号前面的结果我肯定要存下来,那么压栈。左括号前面肯定有一个操作符,这个操作符也一定要记下来,那么也压栈。因为只有加减号,所以如果操作符是+就压1,是-就压-1,这样一直计算直到遇到了右括号,一个完整的括号内的结果就计算好了,然后乘以左括号之前那个操作符即解决了括号前的操作符的问题。
class Solution {
public:
int calculate(string s) {
int res = 0, n = s.size(), sign = 1;
stack<int> stk;
for(int i = 0; i < n; ++i){
char c = s[i];
if(c == '+') sign = 1;
else if(c == '-') sign = -1;
else if(c >= '0'){
int num = 0;
while(i < n && s[i] >= '0'){
num = 10 * num + s[i] - '0';
i++;
}
i--;
res += sign * num;
//cout << res << endl;
} else if(c == '('){
stk.push(res);
stk.push(sign);
res = 0;
sign = 1;
} else if(c == ')'){
res *= stk.top(); stk.pop();
res += stk.top(); stk.pop();
}
}
return res;
}
};