将数据和符号分别压栈
class Solution {
public:
int calculate(string s) {
stack<char> op;
stack<int> num;
int n=s.size();
int i,j;
for(i=0;i<n;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
int tmp=0;
for(;i<n&&isdigit(s[i]);i++)
{
tmp=tmp*10+s[i]-'0';
}
if(!op.empty()&&op.top()=='*')
{
tmp=num.top()*tmp;
num.pop();
num.push(tmp);
op.pop();
}
else if(!op.empty()&&op.top()=='/')
{
tmp=num.top()/tmp;
num.pop();
num.push(tmp);
op.pop();
}
else
num.push(tmp);
}
if(s[i]=='*'||s[i]=='/')
op.push(s[i]);
else if(s[i]=='+'||s[i]=='-')
{
if(!op.empty()&&(op.top()=='+'||op.top()=='-'))
{
int a=num.top();
num.pop();
int b=num.top();
num.pop();
if(op.top()=='+')
num.push(a+b);
else
num.push(b-a);
op.pop();
}
op.push(s[i]);
}
}
while(!op.empty())
{
int a=num.top();
num.pop();
int b=num.top();
num.pop();
cout<<a<<" "<<b<<endl;
if(op.top()=='+')
num.push(a+b);
else if(op.top()=='-')
num.push(b-a);
op.pop();
}
return num.top();
}
};
update:
class Solution {
public:
int calculate(string s) {
stack<int> st;
char op;
int n = s.size();
int i;
int num = 0;
for(i = 0;s[i] != '\0';i++)
{
if(isdigit(s[i]))
{
num = s[i] - '0';
while(i + 1 < n && isdigit(s[i + 1]))
{
num = num * 10 + s[i+1] - '0';
i++;
}
if(op == '*')
{
num = num * st.top();
st.pop();
}
else if(op == '/')
{
num = st.top() / num;
st.pop();
}
else if(op == '-')
num = -num;
}
else if(s[i] == ' ')
continue;
else
{
switch(s[i])
{
case '-':
op = '-';
break;
case '*':
op = '*';
break;
case '/':
op = '/';
break;
case '+':
op = '+';
break;
default:
break;
}
st.push(num);
num = 0;
}
}
st.push(num);
int ans = 0;
while(!st.empty())
{
ans += st.top();
st.pop();
}
return ans;
}
};