面向对象程序设计第四次作业

代码:https://github.com/tinghaishuo/object-oriented/tree/master/Calculator1/Calculator

题目链接:http://www.cnblogs.com/fzuoop/p/5326667.html

思路:

  1. 本次作业在考察栈 stack 和 sstream 知识之外,还考察中缀表达式与前缀/后缀表达式的转换,以及通过命令行编译的知识。

  2. 对于中缀表达式与前缀表达式/后缀表达式的转换,通过在网络上的学习,具体的步骤为:

  3. 参考网址:http://blog.csdn.net/antineutrino/article/details/6763722
    http://blog.csdn.net/lambol_8309/article/details/4524964

前缀表达式:

后缀表达式:

本次作业开始想用后缀表达式完成,结果却出错。因为在用后缀表达式时。-10000+20-3*(20+2)中的-10000会被先用10000进行计算,符号则被当成减号再带入进行计算,导致结果出错。错误结果如下:

于是将中缀表达式改成前缀表达式再进行计算。

对于本次作业,才看到题目的时候有点摸不着头脑,不知道从哪下手。认真百度查阅啦相关的资料,理清了思路,其实也并没有十分困难。在写作业的同时也提高了我自学的能力。虽然改错误改得一脸大写的生无可恋,但每次想放弃的时候,还是咬咬牙,坚持吧。在得到正确答案的时候会觉得之前的努力没白费,颇有一番收获。当然,在这之间也参照啦许多同学的思路与代码,通过不断的尝试,最终完成的。

一下是本次代码的调试结果(部分为非命令行编译):

部分代码:

int Calculation::CalculateExpression(queue<string>q) // 将scan得到的队列进行操作并得出计算结果
{
	int i, n;
	string ss[10000];
	string newss[10000];
	char temp;
	for (i = 0; !q.empty(); i++)
	{
		ss[i] = q.front();
		q.pop();
	}
	n = i - 1;
	for (i = n; i >= 0; i--)
	{
		temp = ss[i][0];
		if (isdigit(temp))
		{
			numb.push(ss[i]);
		}
		else if (temp != '('&&temp != ')')
		{
			if (optr.empty() || optr.top() == ")")
			{
				optr.push(ss[i]);
			}
			else
			{
				compare(temp, optr.top(), ss[i]);
			}
		}
		else
		{
			if (temp == ')')
			{
				optr.push(ss[i]);
			}
			else if (temp == '(')
			{
				while (optr.top() != ")")
				{
					numb.push(optr.top());
					optr.pop();
				}
				optr.pop();
			}
		}
	}
	do
	{
		numb.push(optr.top());
		optr.pop();
	} while (!optr.empty());
	for (i = 0; !numb.empty(); i++)
	{
		newss[i] = numb.top();
		numb.pop();
	}
	n = i - 1;
	for (i = n; i >= 0; i--)
	{
		char temp1 = newss[i][0];
		if (isdigit(temp1))
		{
			final.push(Convert(newss[i]));
		}
		else
		{
			double num1 = final.top();
			final.pop();
			double num2 = final.top();
			final.pop();
			double ret = Calculate(num1, temp1, num2);
			final.push(ret);
		}
	}
	return final.top();
	final.pop();
}

原文地址:https://www.cnblogs.com/s38455/p/5392767.html