《栈结构演示程序.docx》由会员分享,可在线阅读,更多相关《栈结构演示程序.docx(14页珍藏版)》请在优知文库上搜索。
1、算法与数据结构设计报告2012/2013学年第二学期题目:栈结构演示程序专业软件工程学生姓名班级学号指导教师指导单位计算机科学与技术系0期2013年6月评分细那么评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度答复下列问题准确度简短评语教师签名:年月日评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格栈结构演示程序一、课题名称栈结构演示程序。二、课题内容和要求理解栈的结构特点和元素的进栈、出栈等操作,并以表达式计算为例,通过图形方式对进栈、出栈操作进行模拟演
2、示。表达式计算是程序设计编译中的的一个最根本的问题,在表达式求值过程中用到栈。在高级语言程序设计中存在各种表达式,表达式由操作数、操作符、和界限符组成。一个表达式中如果操作符在两个操作数之间,那么称之为中缀表达式。尽管中缀表达式是最普遍使用的书写形式,但在程序设计中常用后缀形式求值,原因是后缀表达式中无括号,计算时无需考虑操作符的优先级。后缀表达式的计算过程为:从左往右依次扫描后缀表达式,遇到操作数就进栈,遇到操作符就从栈中弹出两个操作数,执行该操作符所规定的运算,并将结果进栈。如此下去,直到遇到结束符“旷结束。现在用图形方式,对进栈、出栈操作进行演示。三、需求分析本课题的根本设计要求用堆栈实
3、现,因此建立一个堆栈类,作为操作的根本。由于是对计算过程进行战士,涉及到表达式的计算。而具体的计算过程需要用到后缀表达式,因此需要有一个模块将中缀表达式转换成后缀表达式。定义一个CaICUlatOr类实现计算过程,并在计算过程中,实现对堆栈的输出和展示。因此本程序主要分为三个模块:堆栈类的建立、中缀表达式转换成后缀表达式、后缀表达式的计算及计算过程的展示。四、概要设计在此说明每个局部的算法设计说明(可以是描述算法的流程图,使用ViSiO画图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变号和成员函%原型声明)。开始Infix
4、ToPostfix函数将输入的中缀表达式转换成后缀表达式(正文格式:宋体,小五、详细设计(格式Calcul对后缀过程中出atnr半涌讨RnnW结束勺数实现F在计算J图形输阐各个算法实现的源程序(可以是一组源程序,每个功能模块采用不同的函数实现),源程序要按照写程序的规那么来编写。要结构清晰,重点函数的重点变量,重点功能局部要加上清晰的程序注释。(正文格式:宋体,小4号,不加粗,两端对齐,L5倍行距)Stack,h:ttincludeusingnamespacestd;classCalculator;templateclassStack(public:virtualboolIsEmpty()co
5、nst=0;virtualboolIsFullOconst=O;virtualboolTop(T&x)const=0;virtualboolPush(Tx)=0;virtualboolPop()=0;virtualvoidClearO=O;;templateclassSeqStack:publicStack(public:SeqStack(intmSize);zSeqStackOdeletes;boolIsEmptyOconstreturntop-l;boolIsFul1()constreturntop-maxTop;boolTop(T&x)const;boolPush(Tx);boolPop
6、();voidClearOtop=-l;friendCalculator;private:inttop;intmaxTop;T*s;);templateSeqStack:SeqStack(intmSize)(maxTop-mSize-1;s=newTmSize;top=-l;)templateboolSeqStack:Top(T&x)constif(IsEmpty()CoUtEmpty”endl;returnfalse;)X=Stop;returntrue;)templateboolSeqStack:Push(Tx)(if(IsFull()(cout7z0verflow/zendl;retur
7、nfalse;)S+top=X;returntrue;)templateboolSeqStack:Pop()(if(IsEmptyO)(coutz,underflow7zendl;returnfalse;)top;returntrue;)Calculator,h:Itincludestack.h#includeincludeconstintSIZE=30;char*InfixToPostfix();intisp(charch);inticp(charch);classCalculator(public:Calculator(intmaxSize):s(maxSize);voidRun();vo
8、idClearOs.Clear();)private:SeqStacks;voidPushOperancKdouble);boolGetOperands(double&,double&);voidDoOperator(char);;voidCalculator:PushOperand(doubleop)(s.Push(op);coutz,op。进栈|-l;i-)couts.siz,;coutendl;)boolCalculator:GetOperands(double&opl,double&op2)(if(!s.Top(opl)(Cerr“Missingoperand!z,endl;retur
9、nfalse;)S.PopO;if(!s.Top(op2)(CelTMissingOPerand!”endl;returnfalse;)s.PopO;returntrue;)voidCalculator:DoOperator(charoper)(boolresult;doubleoperl,oper2;result=GetOperands(operl,oper2);if(result)switch(oper)(case+,:s.Push(oper2+operl);coutz,”oper2operl出栈,计算“oper2+operl,结果oper2+operl进栈-l;j)(couts.sjz,
10、”;)coutendl;)break;case-,:s.Push(oper2-operl);cout,zoper2oPerI出栈,计算“oper2-operlX,结果oper2-operl“进栈|-l;i-)(couts.si)coutendl;)break;case,*:s.Push(oper1*oper2);coutzzoper2operl出栈,计算“oper2*operl,”结果oper2*operl“进栈|-l;m-)(couts,sm*;)coutendl;)break;case,:if(fabs(operl)le6)(cerrzzI)ividebyO!zzendl;Clear();
11、)elses.Push(oper2operl);COUtoper2、operl出栈,计算“oper2operl,结果oper2/OPer1进栈|-l;c-)couts.sc)coutendl;)break;,公,case:s.Push(pow(oper2,oper1);coutz,”oper2operl出栈,计算oper2operl,”结果POW(OPer2,oper1)进栈|-l;d-)(couts.sdz,”;)coutendl;)break;)elseClear();)voidCalculator:Run()(charc;doublenewop;char*postfix=InfIxToP
12、ostfix();coutpostfixendl;inti=O;c二postfixi;COUtendl;操作coutz,扫描项endl;whiIe(c!=#)COUtendl;COUtc:case*:case,:case,r:DoOperator(c);break;default:cin.putback(c);cinnewop;PushOperand(newop);break;)c=postfix+i;/coutz,end)COUt“endl;CoUtU|遇到结束符,弹出结果endl;COUtendl;if(s.Top(newop)coutnewopendl;)char*InfixToPostfix()SeqStacks(SIZE);charch,y;s.Push(#);inti=O;char*Postfix=newcharSIZE*sizeof(char);for(intj=0;