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.
计算一个字符串,字符串中只有非负整数,加号,减号,和小括号。
因为没有乘除,所以这道题唯一的难点在于减号后面跟着小括号,因为小括号前面为减号时,小括号里面的运算符都要变号,于是想到一种方法,写一个函数parenthese(),碰到小括号'(' 时,自动进入小括号计算括号内的值,这是一个递归的过程。
举个例子:
3 + (2 - 5 - (5 + 9))
首先parenthese()计算(2 - 5 - (5 + 9)),在这个函数中,会调用自己计算(5 + 9),得到14,最终返回2 - 5 - 14为-17,所以最终的结果就是-14。
代码如下:
int parenthese(string s, int& i)
{
int result = 0;
int sign = 1;
for (i = i + 1; i < s.length(); i++)
{
if (s[i] == '+') { sign = 1; continue; }
if (s[i] == '-') { sign = -1; continue; }
if (s[i] == ' ')continue;
if (s[i] == '(')
{
int temp = parenthese(s, i);
result += sign * temp;
continue;
}
if (s[i] == ')')break;
int temp = s[i] - 48;
for (i = i + 1; i < s.length(); i++)
{
if (s[i] < '0' || s[i] > '9') { i--; break; }
temp = temp * 10 + s[i] - 48;
}
result += sign * temp;
}
return result;
}
int calculate(string s)
{
int result = 0;
int sign = 1;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == ' ')continue;
if (s[i] == '(')
{
int temp = parenthese(s, i);
result += sign * temp;
continue;
}
if (s[i] == '+') { sign = 1; continue; }
if (s[i] == '-') { sign = -1; continue; }
int temp = s[i] - 48;
for (i = i + 1; i < s.length(); i++)
{
if (s[i] < '0' || s[i] > '9') { i--; break; }
temp = temp * 10 + s[i] - 48;
}
result += sign * temp;
}
return result;
}
采用栈的方式也可以实现:int calculate(string s)
{
int result = 0;
int sign = 1;
stack<int> stk;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == ' ')continue;
if (s[i] == '+') { sign = 1; continue; }
if (s[i] == '-') { sign = -1; continue; }
if (s[i] == '(')
{
stk.push(result);
stk.push(sign);
result = 0;
sign = 1;
continue;
}
if (s[i] == ')')
{
result *= stk.top();
stk.pop();
result += stk.top();
stk.pop();
continue;
}
int temp = s[i] - 48;
for (i = i + 1; i < s.length(); i++)
{
if (s[i] < '0' || s[i] > '9') { i--; break; }
temp = temp * 10 + s[i] - 48;
}
result += sign * temp;
}
return result;
}