leetCode 227 基本计算器II(模拟,字符串)

题目链接:点击查看

题目描述:

给定一个包含加减乘除整数运算的字符串,求其运算结果,只保留整数。

输入输出:

输入: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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值