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.
{
public:
int calculate(string s) {
stack<int>num;
stack<char>opera;
int res = 0;
for (auto i = s.begin(); i != s.end(); i++)
{
int tmp = 0;
if (*i == ' ')
continue;
if (*i >= '0' && *i <= '9')
{
for (int tmp2 = 0; *i >= '0' && *i <= '9';)
{
tmp2 *= 10;
tmp2 += *i - '0';
if (i + 1 == s.end() || *(i + 1) <'0' || *(i + 1) > '9')
{
num.push(tmp2);
break;
}
else
++i;
}
continue;
}
if (*i != ')')
opera.push(*i);
else
{
while (opera.top() != '(')
{
opera.top() == '+' ? tmp += num.top() : tmp -= num.top();
opera.pop();
num.pop();
}
tmp += num.top();
num.pop();
num.push(tmp);
opera.pop();
}
}
while (!num.empty())
{
if (!opera.empty())
{
opera.top() == '+' ? res += num.top() : res -= num.top();
opera.pop();
}
else
{
res += num.top();
}
num.pop();
}
return res;
}
};