Use two deques to calculate from both sides.
class Solution {
public:
int calculate(string s) {
deque<int> nums;
deque<char> op;
int len=s.length();
int i=0;
while(i<len)
{
if(s[i]==' ')
i++;
else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')
{
if(!op.empty()&&(op.back()=='*'||op.back()=='/'))
{
int num1=nums.back();
nums.pop_back();
int num2=nums.back();
if(op.back()=='*')
nums.back()=num1*num2;
else
nums.back()=num2/num1;
op.pop_back();
}
op.push_back(s[i]);
i++;
}
else
{
int num=0;
while(i<len&&s[i]>='0'&&s[i]<='9')
{
num=num*10+s[i]-'0';
i++;
}
nums.push_back(num);
}
}
if(!op.empty()&&(op.back()=='*'||op.back()=='/'))
{
int num1=nums.back();
nums.pop_back();
int num2=nums.back();
if(op.back()=='*')
nums.back()=num1*num2;
else
nums.back()=num2/num1;
op.pop_back();
}
while(!op.empty())
{
int num1=nums.front();
nums.pop_front();
int num2=nums.front();
if(op.front()=='+')
nums.front()=num1+num2;
else if(op.front()=='-')
nums.front()=num1-num2;
op.pop_front();
}
return nums.front();
}
};