https://leetcode-cn.com/problems/basic-calculator-ii/
思路一:把输入字符串转换为运算符序列和数字序列,那么就可以先算除法和乘法(从左至右的顺序),再算加法和减法。
class Solution {
public:
int calculate(string s) {
using ll=long long;
vector<ll> nums;
vector<short> op;
int i=0,n=s.size();
while(i<n)
{
if(s[i]==' ')
;
else if(s[i]=='+')
op.push_back(0);
else if(s[i]=='-')
op.push_back(1);
else if(s[i]=='*')
op.push_back(2);
else if(s[i]=='/')
op.push_back(3);
else
{
ll tmp=0;
while(i<n&&s[i]>='0'&&s[i]<='9')
tmp=tmp*10+s[i]-'0',++i;
nums.push_back(tmp);
--i;
}
++i;
}
n=op.size(),i=0;
while(i<n)
{
if(op[i]==2)
nums[i+1]*=nums[i],nums[i]=0;
else if(op[i]==3)
nums[i+1]=nums[i]/nums[i+1],nums[i]=0;
++i;
}
ll sign=1,ans=0;
i=0;
while(i<n)
{
ans+=sign*nums[i];
if(op[i]==0)
sign=1;
else if(op[i]==1)
sign=-1;
++i;
}
return ans+sign*nums[i];
}
};
思路二:思路一的简化版本,我们可以在遍历字符串的时候就计算乘除法,还可以把减法转换为加法,这样最后对栈内元素求和即可。
class Solution {
public:
int calculate(string s) {
vector<int> nums;
int val=0,n=s.size();
char presign='+';
for(int i=0;i<n;i++)
{
if(isdigit(s[i]))
val=val*10+(s[i]-'0');
if((!isdigit(s[i])&&s[i]!=' ')||i==n-1)
{
switch(presign)
{
case '+':
nums.push_back(val);
break;
case '-':
nums.push_back(-val);
break;
case '*':
nums.back()*=val;
break;
case '/':
nums.back()/=val;
break;
default:
break;
}
val=0;
presign=s[i];
}
}
return accumulate(nums.begin(),nums.end(),0);
}
};