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
.
The expression string contains only non-negative integers, +
, -
, *
, /
operators , open (
and closing parentheses )
and empty spaces
. The integer division should truncate toward zero.
You may assume that the given expression is always valid. All intermediate results will be in the range of [-2147483648, 2147483647]
.
Some examples:
"1 + 1" = 2 " 6-4 / 2 " = 4 "2*(5+5*2)/3+(6/2+8)" = 21 "(2+6* 3+5- (3*14/7+2)*5)+3"=-12
Note: Do not use the eval
built-in library function.
class Solution {
public:
int calculate(string s)
{
int pos = 0 ;
return cal(s , pos) ;
}
int cal(string &s , int& pos)
{
long res = 0 , prev_ope , num;
char opn = '.' ;
while(pos < s.size())
{
if(s[pos] == '(')
{
pos++ ;
num = cal(s , pos) ;
if(opn == '-')
{
opn = '+' ;
num -= 2 * num ;
}
getRes(opn , prev_ope , res , num) ;
cout<<"res:"<<res<<endl;
}
else if(s[pos] == ')')
{
pos++ ;
return res ;
}
else if(s[pos] == '+' || s[pos] == '*' ||s[pos] == '/' || s[pos] == '-')
{
opn = s[pos] ;
pos++ ;
}
else if(isdigit(s[pos]))
{
num = getNum(s , pos) ;
if(opn == '-')
{
opn = '+' ;
num -= 2 * num ;
}
getRes(opn , prev_ope , res , num) ;
cout<<"res:"<<res<<endl;
}
else
pos++ ;
}
return res ;
}
long getNum(string &s , int &pos)
{
long num = 0 , beginpos = pos ;
bool isnega = false ;
while(isdigit(s[pos])) pos++ ;
num = stol(s.substr(beginpos , pos - beginpos)) ;
return num ;
}
void getRes(char opn , long &prev_ope , long& res , long num)
{
switch(opn)
{
case '.':
res = num ;
prev_ope = num ;
break ;
case '+':
res = res + num ;
prev_ope = num ;
break ;
case '*':
res -= prev_ope ;
prev_ope *= num ;
res += prev_ope ;
break ;
case '/':
res -= prev_ope ;
prev_ope /= num ;
res += prev_ope ;
break ;
}
}
};