题目链接:点击查看
题目描述:
给定一个包含加减乘除整数运算的字符串,求其运算结果,只保留整数。
输入输出:
输入:s = "3+2*2" 输出:7
输入:s = " 3/2 " 输出:1
题目分析:
如果我们在字符串左边加上一个加号,可以证明其并不改变运算结果,且字符串可以分割成多个 <
一个运算符,一个数字
>
对子的形式;这样一来我们就可以从左往右处理了。由于乘除的优先级高于加减,因此我们需要使用一个中间变量来存储高优先度的运算结果。此类型题也考察很多细节处理,如无运算符的情况,和多个空格的情况等等。
代码:
int calculate(string s)
{
int i=0;
return parseExpr(s,i);
}
int parseExpr(const string &s,int &i)
{
char op='+';//初始化op为'+' 即完成<一个运算符,一个数字>对子的形式
long left=0,right=0;
while(i<s.length())
{
if(s[i]!=' ')
{
long n=parseNum(s,i);
switch(op)//将数字分成两部分 方便处理优先级
{
case '+':left+=right;right=n;break;
case '-':left+=right;right=-n;break;
case '*':right*=n;break;
case '/':right/=n;break;
}
if(i<s.length())
{
op=s[i]; //延时储存方便对于字符串进行操作
}
}
++i;
}
return left+right;
}
long parseNum(const string&s,int &i)
{
long n=0;
while(i<s.length()&&isdigit(s[i]))
{
n=10*n+(s[i++]-'0');//将(多位)字符串数字转化为数字
}
return n;
}