224 Basic Calculator
链接:https://leetcode.com/problems/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.
Hide Tags Stack Math
计算表达式,这一题是Basic Calculator II https://leetcode.com/problems/basic-calculator-ii/的简化版。
class Solution {
public:
int calculate(string s) {
stack<int> num;
stack<char> oper;
string expression="";
for(int i=0;i<s.size();i++)
{if(s[i]!=' ')
expression+=s[i];
}
int temp=0;
for(int i=0;i<expression.length();i++)
{
if(expression[i]-'0'<10&&expression[i]-'0'>-1)
temp=temp*10+expression[i]-'0';
else if(expression[i]=='(')
oper.push(expression[i]);
else
{
if(expression[i]=='*'||expression[i]=='/')
{
if(!oper.empty()&&(oper.top()=='*'||oper.top()=='/'))
{
switch(oper.top())
{
case '*':temp=num.top()*temp;num.pop();oper.pop();break;
case '/':temp=num.top()/temp;num.pop();oper.pop();break;
default: break;
}
}
num.push(temp);
temp=0;
oper.push(expression[i]);
}
else if(expression[i]=='+'||expression[i]=='-')
{
while(!oper.empty()&&(oper.top()=='+'||oper.top()=='-'||oper.top()=='*'||oper.top()=='/'))
{
switch(oper.top())
{
case '*':temp=num.top()*temp;num.pop();oper.pop();break;
case '/':temp=num.top()/temp;num.pop();oper.pop();break;
case '+':temp=temp+num.top();num.pop();oper.pop();break;
case '-':temp=num.top()-temp;num.pop();oper.pop();break;
default: break;
}
}
num.push(temp);
temp=0;
oper.push(expression[i]);
}
else if(expression[i]==')')
{
while(oper.top()!='(')
{
switch(oper.top())
{
case '+':temp=temp+num.top();num.pop();break;
case '-':temp=num.top()-temp;num.pop();break;
case '*':temp=num.top()*temp;num.pop();break;
case '/':temp=num.top()/temp;num.pop();break;
default: break;
}
oper.pop();
}
oper.pop();
}
}
}
while(!oper.empty())
{
switch(oper.top())
{
case '+':temp=temp+num.top();num.pop();break;
case '-':temp=num.top()-temp;num.pop();break;
case '*':temp=num.top()*temp;num.pop();break;
case '/':temp=num.top()/temp;num.pop();break;
default: break;
}
oper.pop();
}
return temp;
}
};