左神算法学习日记——计算表达式结果

写代码过程中应该把代码意义写出来,理清思路,发现边界条件。 

void calelem(deque<string>& que,int pre)//这个部分一直出错,因为没有考虑清楚pre是第一个字符和之前字符是加减号时该怎么处理,这时应该直接放入队列
{
	if (!que.empty())
	{
		string temp = que.back();
		if (temp == "*" || temp == "/")//如果之前的字符是乘除号,则计算乘除结果
		{
			que.pop_back();
			pre = temp == "*" ? pre * (atoi(que.back().c_str())) : (atoi(que.back().c_str()) / pre);
			que.pop_back();
		}
	}
	que.push_back(to_string(pre));//如果pre是第一个数字或之前的字符是加减号则将数字直接放入队列,如果是乘除号则将计算结果放入队列
}

int getsum(deque<string>& que)
{
	int res = 0;
	while (!que.empty())
	{
		string cur = que.front();
		que.pop_front();
		if (cur == "+" || cur == "-")//如果当前字符是加减,则计算结果
		{
			int temp = atoi(que.front().c_str());
			que.pop_front();
			res += cur == "+" ? temp : (-temp);
		}
		else
			res = atoi(cur.c_str());
	}
	return res;
}

std::unique_ptr<int[]> getres(string s, int i)
{
	deque<string> que;
	int pre = 0;
	while (i < s.size() && s[i] != ')')//如果遇到)则结束或者到达字符串的最后一个字符则结束
	{
		if (s[i]>='0'&&s[i] <= '9')
			pre = 10 * pre + s[i++]-'0';
		else if (s[i] != '(')//如果当前字符是运算符
		{
			calelem(que, pre);//根据之前的字符判断怎么操作pre
			que.push_back(string(1,s[i++]));//将当前字符放入队列中
			pre = 0;//将pre置0,以便能计算下一个数字
		}
		else//如果遇到左括号,则计算括号内的结果,利用了递归的方式,因为子步骤都一样
		{
			std::unique_ptr<int[]> arr = move(getres(s, i+1));
			pre = arr[0];//返回括号内的结果
			i = arr[1];
		}
	}
	que.push_back(to_string(pre));//循环结束,将pre放入队列
	std::unique_ptr<int[]> a(new int[2]);//不能使用局部数组,返回后该数组将被释放掉
        res[0] = getsum(que);
        res[1] = i + 1 ;//进行剩余的加减运算,并返回结果,和当前的位置。
	return a;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值