每个数字本身是不会变的,我们只需要控制好它前面的符号。一开始默认符号为正,向栈中压入数字1表示正数,接着遍历字符串,遇到+时,符号保持原样即可,不需要改变,遇到 - 号时符号取负,遇到左括号时我们需要将此时的符号入栈,因为它是控制括号内数字符号的,遇到右括号时将控制该对括号内数字的符号出栈,最后如果是数字则进行计算。
class Solution {
public:
int calculate(string s) {
int len = s.length();
int i = 0,sign = 1;//sign控制正负
stack<int> ops;
ops.push(sign);
int ans = 0;
while(i<len) {
if(s[i]==' ')i++;
else if(s[i]=='+') {
sign = ops.top();
i++;
}
else if(s[i]=='-') {
sign = -ops.top();
i++;
}
else if(s[i]=='(') {
ops.push(sign);//标记括号里面数字的符号
i++;
}
else if(s[i]==')') {
ops.pop();//控制该括号内数字的符号可以出栈了
i++;
}
else {
long long num = 0;
while(i<len&&s[i]>='0'&&s[i]<='9') {
num = num*10 +s[i]-'0';
i++;
}
ans += sign*num;
}
}
return ans;
}
};