后缀表达式求值Word格式文档下载.docx
《后缀表达式求值Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《后缀表达式求值Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
2.3主要算法流程图.
Y
N
图2-4总体算法流程图
3程序清单及注释
//这是一个标准的堆栈模板程序,因为使用模板,所以定义在一个文件里。
#if!
defined(CPP6_H)
#defineCPP6_H
#include<
iostream>
stdlib.h>
usingnamespacestd;
constintMaxStackSize=50;
template<
classT>
classStack
{private:
Tstacklist[MaxStackSize];
inttop;
//栈的大小
public:
Stack(void);
voidPush(constT&
item);
//压栈
TPop(void);
voidClearStack(void);
//清栈
TPeek(void)const;
intStackEmpty(void)const;
//判断栈空
intStackFull(void)const;
//判断栈满
};
Stack<
T>
:
Stack(void):
top(-1)
{}
voidStack<
Push(constT&
item)
{if(StackFull())
{
cerr<
"
Stackoverflow!
endl;
exit
(1);
}
top++;
stacklist[top]=item;
}
TStack<
Pop()
{Ttemp;
if(StackEmpty())
{
cerr<
Attempttopopanemptystack!
exit
(1);
temp=stacklist[top];
top--;
returntemp;
ClearStack(void)
{
top=-1;
Peek(void)const
if(top==-1)
Attempttopeekatanemptystack!
returnstacklist[top];
intStack<
StackEmpty(void)const
returntop==-1;
StackFull(void)const
returntop==MaxStackSize-1;
#endif
/*****************************************************************/
//这里定义一个计算器模板类,模拟后缀表达式的计算过程。
defined(CALCULATOR_H)
#defineCALCULATOR_H
#include"
cpp6.h"
math.h>
classCalculator
//私有成员:
计算器栈及操作数
Stack<
S;
voidEnter(Tnum);
//存放操作数
boolGetTwoOperands(T&
opend1,T&
opend2);
voidCompute(charop);
Calculator(void){}//计算表达式及清空计算器
voidRun(void);
voidClear(void);
voidCalculator<
Enter(Tnum)//在栈中存放数据值
S.Push(num);
//从栈中取得操作数并赋值给形参。
若操作数不够,则打印出错
boolCalculator<
GetTwoOperands(T&
opend2)//信息,并返回false
if(S.StackEmpty())
Missingoperand!
returnfalse;
opend1=S.Pop();
//取右操作数
if(S.StackEmpty())
opend2=S.Pop();
//取左操作数
returntrue;
//运算求值
Compute(charop)
boolresult;
Toperand1;
Toperand2;
//取两个操作数,并判断是否成功取到
result=GetTwoOperands(operand1,operand2);
//若成功取到,则计算本次运算值,否则将栈清空
if(result==true)
switch(op)
case'
+'
S.Push(operand2+operand1);
break;
-'
S.Push(operand2-operand1);
*'
S.Push(operand2*operand1);
/'
if(operand1==0)
{
cerr<
Divideby0!
S.ClearStack();
}
else
S.Push(operand2/operand1);
break;
^'
S.Push(pow(operand2,operand1));
break;
else
S.ClearStack();
//出错清空计算器
Run(void)//读入字符串,同时对后缀表达式求值,直到读入‘=’时停止
charc;
Tnewoperand;
while(cin>
>
c,c!
='
)
switch(c)
{
case'
Compute(c);
default:
cin.putback(c);
//非运算符,则必为操作数,将字符送回
cin>
newoperand;
//读入操作数并将其存入栈中
Enter(newoperand);
}
if(!
S.StackEmpty())
cout<
S.Peek()<
//答案已在栈中,用Peek()输出
Clear(void)
S.ClearStack();
/*************************************************************/
//创建一个Calculator的对象,以便验证程序功能。
calculator.h"
voidmain()
Calculator<
double>
CALC;
cout<
*********************************************"
***请先将中缀表达式形如:
32*(6-15)+35=***"
***转化为:
***"
***后缀表达式:
32615-*35+=***"
CALC.Run();
4运行结果与分析
后缀表达式求值的结果如图4-1所示。
图4-1后缀表达式求值运行结果图
分析:
首先想要运行这个程序,必须要了解怎样将平常我们习惯用的中缀表达式转换成程序可读的后缀表达式,这是最重要的。
其次就是输入后缀表达式后一定要再输入一个“=”,否则程序将无法正常输出结果。
5总结
通过《后缀表达式求值》这个课程设计,我发现自己在C++以及C语言的学习上仍存在着很多不足.至少在很多细节问题上并没有完全弄懂.对于不常用的知识点掌握的十分不牢固,虽然只是一个简单的计算器功能,却让我很吃力,而且从“中缀表达式”到“后缀表达式”需要操作者自己去转换。
其实我对这些概念也同样不是很了解,幸好有李老师耐心指导,经过多次调试终于完成了,尽管这次课程设计做的不是很成功,但是通过这次亲手操作和经过老师和同学的交流学到了挺多东西的。
最起码对堆栈和模板的使用有了更为深入的理解。
在这个过程真的想放弃,但是坚持后的成功会告诉你。
其实成功并不是那么遥远,只要你坚持不懈。
参考文献
[1]李爱华,程磊著.面向对象程序设计(C++语言).北京:
清华大学出版社,2010
[2]陈清华,朱红著.C++程序设计实践指导.北京:
清华大学出版社,2005
[3]马秀丽,刘志妩.C语言程序设计.北京:
清华大学出版社,2008
[4]刘振安,刘燕君.C++程序设计课程设计.北京:
清华大学出版社,2004忽略此处..