思路
- 题目符号只有+和-,每个数字的符号取决于其前面若干符号的作用
- 维护一个符号栈,当前的真正符号为数字前面的符号和前面若干符号的作用
- 遇到 “(” 进行符号的压入,遇到 “)” 进行符号的弹出
- 例如 1+5-(9+(8-1)) 那么8的真正符号为 + - + 最终为 -
- 最后只需要对字符串进行若干次加法即可(加正数或负数)
代码
class Solution {
public:
int calculate(string s) {
stack<int> ops;ops.push(1);
int sign = 1;
int ans = 0;
int i = 0;
while (i < s.length()) {
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 num = 0;
while (i < n && s[i] >= '0' && s[i] <= '9') {
num = num * 10 + s[i] - '0';
i++;
}
ans += sign * num;
}
}
return ans;
}
};