面向对象程序设计第四次作业
代码:https://github.com/tinghaishuo/object-oriented/tree/master/Calculator1/Calculator
题目链接:http://www.cnblogs.com/fzuoop/p/5326667.html
思路:
-
本次作业在考察栈 stack 和 sstream 知识之外,还考察中缀表达式与前缀/后缀表达式的转换,以及通过命令行编译的知识。
-
对于中缀表达式与前缀表达式/后缀表达式的转换,通过在网络上的学习,具体的步骤为:
-
参考网址: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();
}