一、题目
二、分析
用栈来记录符号数。首先初始化为正数,即栈中放入一个1,代表正数。不用记录数值,类似于如下分解:
-(3-(4+5))
从左开始遍历,- 号,则符号数为 -1; 栈中栈顶符号数的相反数
遇到左括号,将符号数入栈,表示一个括号内数值计算结果的正负。
遇到 3,使用符号数 -1 进行计算,res = -1 * 3 = -3;
遇到 - 号,则符号数等于 1;栈中栈顶符号数的相反数
遇到左括号,符号数等于 1,入栈,
遇到 4,使用栈顶符号数 1 进行计算,res= -3 + 1*4 = 1;
遇到 + 号,符号数不变,
遇到 5,使用栈顶符号数 1 进行计算,res= 1 + 1*5 = 6;
遇到右括号,说明最新的符号数即将失效,即栈顶符号数出栈。
遇到右括号,同上一步。
所以可以看到,全程有一个 res 和符号数 sign 来记录结果和当前步骤的符号数。
三、代码
class Solution {
public:
int calculate(string s) {
stack<int> ops;
ops.push(1);
int sign = 1;
int ret = 0;
int n = s.length();
int i = 0;
long num = 0;
while (i < n)
{
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
{
num = 0;
while (i < n && s[i] >= '0' && s[i] <= '9')
{
num = num * 10 + s[i] - '0';
i++;
}
ret += sign * num;
}
}
return ret;
}
};
执行用时:16 ms, 在所有 C++ 提交中击败了58.33%的用户
内存消耗:7.9 MB, 在所有 C++ 提交中击败了81.94%的用户