【LeetCode-224】基本计算器
问题
实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。
- 1 <= s.length <= 3 * 105
- s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
- s 表示一个有效的表达式
示例
输入: s = " 2-1 + 2 "
输出: 3输入: s = "(1+(4+5+2)-3)+(6+8)"
输出: 23
解答:括号展开
class Solution {
public:
int calculate(string s) {
stack<int> stk;
stk.push(1); // 默认表达式有一个大括号包着,括号前为正号
int n = s.size(), res = 0, sign = 1; // sign初始化为1,相当于第一个数为正数时前面加一个正号
for (int i = 0; i < n; i++) {
if (s[i] == ' ') continue;
switch (s[i]) {
case '+': sign = stk.top(); break;
case '-': sign = -stk.top(); break;
case '(': stk.push(sign); break;
case ')': sign = stk.top(); stk.pop(); break;
default: {
int ans = 0;
while (i < n && isdigit(s[i]))
ans = ans * 10 - '0' + s[i++];
i--;
res += sign * ans;
}
}
}
return res;
}
};
重点思路
由于本题操作符只有正负号,所以可以考虑直接将括号展开,通过一次遍历逐个数字相加。sign
为当前数真正的正负号,栈stk
存储括号前的正负号(括号前的正负号会影响当前真实正负号)。每次遇到右括号时,此时表明该括号结束,则出栈一个元素;反之,将当前真实正负号入栈。