Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open (
and closing parentheses )
, the plus +
or minus sign -
, non-negative integers and empty spaces .
You may assume that the given expression is always valid.
Some examples:
"1 + 1" = 2 " 2-1 + 2 " = 3 "(1+(4+5+2)-3)+(6+8)" = 23
Note: Do not use the eval
built-in library function.
一般这种题都和栈有关。维护数值和符号两个变量,遇到(时,将括号前的数值和符号分别压栈保存,遇到)时,将括号中当前计算的值和之前压栈的数以之前压栈的符号进行计算。
不要忘了对最后一个数字的计算。
比较坑的地方是表达式中会有空格,读题不仔细
class Solution {
public:
int calculate(string s) {
stack<int> op, ss;
int now = 0, sum = 0, flag = 1;
for(int i = 0; i < s.size(); i++)
{
if(s[i] >= '0' && s[i] <= '9') now = now * 10 + s[i] - '0';
else
{
sum += flag * now;
now = 0;
if(s[i] == ' ')continue;
else if(s[i] == '+') flag = 1;
else if(s[i] == '-') flag = -1;
else if(s[i] == '(')
{
ss.push(sum);
op.push(flag);
sum = 0;
flag = 1;
}
else
{
sum = ss.top() + sum * op.top();
op.pop();
ss.pop();
}
}
}
return sum + now * flag;
}
};