原文地址:http://www.cnblogs.com/ganganloveu/p/4640589.html
Basic Calculator
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.
1、表达式运算还是得用两个栈。
2、当顺序执行时,当数据栈每压进一个元素,根据操作符栈是否为空进行操作。而不是当操作符栈每压进一个元素时操作,那样要考虑的东西太多。
3、当有括号“)”时,要一直运行到“(”出现为止。此时可能有括号嵌套的情况,一次循环结束,要继续判断。
class Solution {
public:
int calculate(string s) {
stack<int> num;
stack<int> op;
int i = 0;
while(i < s.size())
{
while(i < s.size() && s[i] == ' ')
i ++;
if(i == s.size())
break;
if(s[i] == '+' || s[i] == '-' || s[i] == '(')
{
op.push(s[i]);
i ++;
}
else if(s[i] == ')')
{
while(op.top() != '(')
{// calculation within parentheses
int n2 = num.top();
num.pop();
int n1 = num.top();
num.pop();
if(op.top() == '+')
num.push(n1 + n2);
else
num.push(n1 - n2);
op.pop();
}
op.pop();
while(!op.empty() && op.top() != '(')
{
int n2 = num.top();
num.pop();
int n1 = num.top();
num.pop();
if(op.top() == '+')
num.push(n1 + n2);
else
num.push(n1 - n2);
op.pop();
}
i ++;
}
else
{
int n = 0;
while(i < s.size() && s[i] >= '0' && s[i] <= '9')
{
n = n*10 + (s[i]-'0');
i ++;
}
num.push(n);
while(!op.empty() && op.top() != '(')
{
int n2 = num.top();
num.pop();
int n1 = num.top();
num.pop();
if(op.top() == '+')
num.push(n1 + n2);
else
num.push(n1 - n2);
op.pop();
}
}
}
return num.top();
}
};