数据结构实验参考格式.docx
- 文档编号:10663615
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:15
- 大小:18.38KB
数据结构实验参考格式.docx
《数据结构实验参考格式.docx》由会员分享,可在线阅读,更多相关《数据结构实验参考格式.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构实验参考格式
数据结构实验设计报告
题目名称:
设计环境:
指导教师:
专业班级:
姓名:
学号:
联系电话:
电子邮件:
设计日期:
指导教师评语:
设计成绩:
____________指导教师签名:
____________
设计报告日期:
工程训练实习总结报告
每次上课,我都会提前几分到训练基地,但我发现,老师总在我之前,并且已经画好图、检验好机床设施等待同学们的到
算术表达式求值演示
1.题目简介
2.需求分析
2.1输入形式和输入值的范围
2.2输出的形式
2.3程序所能达到的功能
2.4测试数据
3.设计思路及具体实现
4.调试分析
5.测试结果和分析
5.1输入中缀表达式信息
5.2中缀变为后缀表达式
5.3后缀表达式计算过程
6.实验总结
1.题目
算术表达式求值演示
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子,设计一个程序,实现利用算符优先算法计算算术表达式求值。
2.需求分析
本演示程序用C++编写,实现利用算符优先算法计算算术表达式求值:
(1)通过键盘输入表达式字符序列,并转换为整数表达式。
(2)进行输入合法性验证
(3)对算术运算表达式求值
(4)运算符包括乘方,开方,单目减等运算符
2.1输入的形式和输入值的范围:
将需要计算的中缀表达式通过键盘输入,输入形式是字符型;
2.2输出的形式
输入操作结束后,如同输入的表达式非法,则会显示“您输入的表达式错误!
”字样,如果输入是正确的,则直接进入计算过程,首先是把中缀表达式变换为后缀表达式输出,然后再显示每一步后缀表达式运算过程,最终输出表达式计算过程。
4
2.3程序所能达到的功能:
将中缀表达式转换为后缀表达式,后缀表达式计算出最终结果,自动退出系统服务。
2.4测试数据:
A.测试输入中缀表达式。
在主函数中输入提示输入语句结束后,开始输入表达式,系统自动检验输入是否正确。
B.测试中缀变后缀表达式函数Infix(Middle,Middle.length(),Behind),在函数中添加语句,显示“转换的后缀表达式如下:
”字样,然后循环输出数组array[]保存后缀表达式的字符。
C.测试后缀表达式计算函数Suffixal(Behind,length),添加语句实现循环输出后缀表达式计算的每一步,直到计算出最终结果。
D.测试退出系统功能。
输入任意键退出系统。
3.设计思路及具体实现
实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。
对主程序和其他模块写出伪码算法。
3.1数据类型
//用类SeqStack来存储中缀表达式字符
classSeqStack
{
private:
chardata[MaxStackSize];//存放数据元素的数组
5
inttop;//栈顶位置指示器
public:
SeqStack(void)//构造函数
{top=0;}
~SeqStack(void){}//析构函数
voidPush(constchar&item);//入栈
charPop(void);//出栈
charPeek(void)const;//读栈顶元素
boolStackEmpty(void)const//判断堆栈是否为空
{return(top==0);}
intGetSize(void)const//读栈顶元素个数
{returntop;}
voidClearStack(void)//清空栈
{top=0;}
};
3.2基本操作
//运算符优先级比较
charProceed(chara,charb)//运算符优先级比较
{
charResult;
charMidString[2];
6
Result='<';
MidString[0]=b;
MidString[1]=0;
if(((a=='+'||a=='-')&&strstr("+-)#",MidString)!
=NULL)||((a=='*'||a=='/')&&strstr("+-*/)#",MidString)!
=NULL)||(a=='^')&&strstr("+-*/^)#",MidString)!
=NULL)//k表开方
Result='>';
elseif((a=='('&&b==')')||(a=='#'&&b=='#'))
Result='=';
elseif((a=='('&&b=='#')||(a==')'&&b=='(')||
(a=='#'&&b==')'))
Result='';
returnResult;
}
//中缀变后缀表达式函数:
intInfix(string&middle,intn,intarray[])//中缀变后缀
{
SeqStacks;
charx1,x2;
intj=0,z,count=0;
s.Push('#');
7
x1=s.Peek();
while(j { x2=middle[j]; if(x2>='0'&&x2<='9') { z=x2-'0'; j++; while(j { z=z*10+middle[j++]-'0'; } array[count++]=z; } elseif(x2=='$')//$表示开方符 { if(j==(n-1)||middle[j+1]>57&&middle[j+1]<48) { cout<<"您输入的表达式错误! "< exit(0); } 8 j++; z=middle[j++]-'0'; while(j { z=z*10+middle[j++]-'0'; } array[count++]=sqrt(z); } elseif(x2! ='+'&&x2! ='-'&&x2! ='*'&&x2! ='/'&&x2! ='^'&&x2! ='('&&x2! =')') { cout<<"您输入的表达式错误! "< exit(0); } else { if(Proceed(x1,x2)=='<') { s.Push(x2); x1=x2; 9 } } elseif(Proceed(x1,x2)=='>') { if(x1! ='+'&&x1! ='-'&&x1! ='*'&&x1! ='/'&&x1! ='^') { cout<<"您输入的表达式错误! "< exit(0); } array[count]=int(x1); flag[count++]=true; s.Pop(); x1=s.Peek(); while(Proceed(x1,x2)=='>') { if(x2! ='+'&&x2! ='-'&&x2! ='*'&&x2! ='/'&&x2! ='^') { cout<<"您输入的表达式错误! "< exit(0); } array[count]=int(x1); 10 flag[count++]=true; s.Pop(); x1=s.Peek(); } if(Proceed(x1,x2)=='') { { cout<<"您输入的表达式错误! "< exit(0); } } elseif(Proceed(x1,x2)=='=') { s.Pop(); x1=s.Peek(); } else { s.Push(x2); x1=x2; } 11 } elseif(Proceed(x1,x2)=='=') { s.Pop(); x1=s.Peek(); } else { cout<<"您输入的表达式错误! "< exit(0); }j++; } } x2='#'; while (1)//清空栈 { if(Proceed(x1,x2)=='=') { break; } if(Proceed(x1,x2)=='>') 12 { if((x1! ='+')&&(x1! ='-')&&(x1! ='*')&&(x1! ='/')&&(x1! ='^')) { cout<<"您输入的表达式错误! "< exit(0); } array[count]=int(x1); flag[count++]=true; s.Pop(); if(s.StackEmpty()) { cout<<"您输入的表达式错误! "< exit(0); } x1=s.Peek(); } else { cout<<"您输入的表达式错误! "< exit(0); } 13 } inti,k=0;//k表示操作符的个数 for(i=0;i { if(flag[i]) { k++; } } if((k*2+1)! =count)//运算符不比运算数少1,则非法 { cout<<"您输入的表达式错误! "< exit(0); } if(count>=0) { cout<<"转换的后缀表达式如下: "< for(i=0;i { if(flag[i]) 14 { cout< } else cout< } cout< } returncount; } //后缀表达式的运算 voidSuffixal(ints[],intt)//后缀表达式的运算 { while(t>1) { intj=0; while(j+2 flag[j+2]) j++; if(j+2>=t) break; 15 switch(char(s[j+2])) { case'+': s[j]=s[j]+s[j+1];break; case'-': s[j]=s[j]-s[j+1];break; case'*': s[j]=s[j]*s[j+1];break; case'/': s[j]=s[j]/s[j+1];break; case'^': s[j]=pow(s[j],s[j+1]);break; } for(inti=j+1;i { s[i]=s[i+2]; flag[i]=flag[i+2]; } t=t-2; for(i=0;i { if(flag[i]) { cout< } else 16 cout< } cout< } } 3.3主函数功能伪代码: intmain() { stringMiddle;//接收中缀表达试 intBehind[1000];//此数组用来接收中缀所变得整形后缀表达式 cout<<"请输入需要计算的中缀表达式(加、减、乘、除、乘方、开方分别用+、-、*、/、^、$表示)"< cin>>Middle; intlength=Infix(Middle,Middle.length(),Behind); if(length>1) Suffixal(Behind,length);//后缀运算 return0; } 4.调试分析 开始设计时,使用数组存储中缀表达式,其中有一些麻烦,后 17 来发现用顺序堆栈存储会更显得方便,所以改用顺序堆栈。 在存储中缀表达式过程中,需要先把字符数字改为数学数字。 其中,还有要把运算符号改为数字形式,最终有其还原。 5.测试结果和分析 5.1输入中缀表达式信息 直接输入需要转换和计算的中缀表达式,接着系统自动对算术表达式进行合法性验证。 如果错误,就显示出错语句提示,并退出程序。 5.2中缀变为后缀表达式 如果上一步验证算术表达式合法,就进入中缀转换为后缀函数,并输出转换后的后缀表达式。 5.3后缀表达式计算过程 输出玩后缀表达式后,紧接着进入下一步操作,由后缀表达式计算出最终结果,并显示中间的每一步计算过程,然后按任意键退出程序。 6.案例总结 表达式计算是编译系统中的基本问题,利用堆栈来实现表达式的转换和计算,编译系统对中缀形式的算术表达式处理的方法是,先把它转换为后缀形式的算术表达式,然后再计算后缀表达式,计算后缀表达式值的过程仍然是一个堆栈应用过程。 此算术表达式演示功能比较齐全,能够实现算术表达式的转换和计算,其中的运算除了基本的加、减、乘、除以外,还添加了乘方和开方运算符。 但是还可以进一步改进,增加更多的功能。 若考虑到界面友好问题,再增加一些改变界面的功能,使界面变得较友好,效果会更好。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 参考 格式