数据结构课程实验报告 实验3.docx
- 文档编号:8561997
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:142.86KB
数据结构课程实验报告 实验3.docx
《数据结构课程实验报告 实验3.docx》由会员分享,可在线阅读,更多相关《数据结构课程实验报告 实验3.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构课程实验报告实验3
HUNANUNIVERSITY
课程实习报告
题目:
逆波兰表达式求解
学生姓名康小雪
学生学号20090810310
专业班级计科三班
指导老师李晓鸿
完成日期2010-10-16
一、需求分析
1程序以用户和计算机对话方式得到一个后缀表达式以#表示输入结束,由计算机该表达式的值,并判断表达式是否合法。
2输入的数字可以是小数也可以是整数。
3在后缀表达式的改写中,采用的方法是,先找到最近的两个操作数,然后,找到运算符,进行运算,把运算后的值作为一个操作数,再到后面寻找下一个操作数及运算符,以此类推。
4输入输出举例
输入:
23*1–#
输出:
5
二、概要设计
抽象数据类型
算法中用到了先进先出,后进后出的思想,为实现上述程序的功能,故采用堆栈来实现。
ADTStack{
数据对象:
D={
∈ElemType,i=1,2,…,n,n>=0}
数据关系:
R1={
∈D,i=2,…,n}
基本操作:
InitStack(&S)
操作结果:
构造一个空栈S
DestroyStack(&S)
初始条件:
栈S已存在
操作结果:
栈S被销毁
ClearStack(&S)
初始条件:
栈S已存在
操作结果:
栈S清为空栈
StackEmpty(S)
初始条件:
栈S已存在
操作结果:
若S为空栈,则返回TRUE,否则FALSE
StackLength(S)
初始条件:
栈S已存在
操作结果:
返回S元素的个数,即栈的长度
GeTop(S,&e)
初始条件:
栈S已存在且非空
操作结果:
用e返回S的栈顶元素
Push(&S,e)
初始条件:
栈S已存在
操作结果:
插入元素e为新的栈顶元素
Pop(&S,&e)
初始条件:
栈S已存在且非空
操作结果:
删除S的栈顶元素,并返回e
StackTraverse(S,visit())
初始条件:
栈S已存在且非空
操作结果:
从栈底到栈顶依次对S的每个元素调用函数visit(),一旦visit()失败,则操作失败
}ADTStack
算法的基本思想
在输入中寻找运算符,若查找到的是数字,则将它放置一边,当找到一个运算符时,用最后放置的两个数进行运算符的运算,运算后的结果再放置一边,继续查找下一个运算符,找到第二个运算符后,继续用最后放置的两个操作数来进行相应运算,运算结果再放置一边,以此类推。
直至完成最后一个运算符的运算为止,此时,若输入合法,则所有放置的数据都将只剩下一个,反之,输入不合法。
程序的流程
程序由两个个模块组成:
(1)主函数模块;
while(i<100)
{
scanf("%c",&c);
ch[i++]=c;
if(c=='#')
break;
}
St=evaluate(ch,result);
if(St)
printf("resultis%5.2f\n",result);
else
printf("\n表达式错误\n");
(2)处理并计算模块;实现计算输入的逆波兰表达式,并判断表达式合法
模块调用关系:
主函数模块
处理并计算模块
三、详细设计
物理数据类型
根据题目要求和堆栈的基本操作的特点,采用堆栈来实现。
//基本操作的函数原型
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#defineOK1
#defineTRUE1
#defineFALSE0
#defineERROR0
#defineOVERFLOW-2
typedeffloatSElemtype;
typedefintStatus;
typedefstruct
{
SElemtype*base;
SElemtype*top;
intstacksize;
}SqStack;
StatusInitStack(SqStack&S)
{
S.base=(SElemtype*)malloc(STACK_INIT_SIZE*sizeof(SElemtype));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
intStackLength(SqStackS)
{
//获得堆栈元素的个数
//填空
returnS.top-S.base;
}
StatusPush(SqStack&S,SElemtypee)
{
//入栈
//填空
S.top++;
*(S.top)=e;
returntrue;
}
StatusPop(SqStack&S,SElemtype&e)
{
//出栈
//填空
if(S.top e=*(S.top); S.top--; returntrue; } StatusIsDigital(charch) { if(ch>='0'&&ch<='9') { return1;//是数字字母 } return0;//不是数字字母 } intEvalValue(char*ch,SqStack&S) { inti=0; SElemtyperesult=0; chara; a=ch[i]; while(IsDigital(a)) { result=10*result+(int)(a-48); a=ch[++i]; } Push(S,result); returni; } voidEvalExpr(charch,SqStack&S) { //如果ch中保存的是操作符,则从堆栈中弹出两个元素,并把操作符应用在这两个元素之上, //然后把操作结果压入到栈中。 如果试图从栈中弹出两个元素是,该栈中并没有,那么该 //后缀表达式是不正确的。 //填空 SElemtypea,b; switch(ch){ case'+': if(! Pop(S,a)){ printf("\n表达式错误\n"); system("pause"); } if(! Pop(S,b)){ printf("\n表达式错误\n"); system("pause"); } Push(S,a+b); break; case'-': if(! Pop(S,a)){ printf("\n表达式错误\n"); system("pause"); } if(! Pop(S,b)){ printf("\n表达式错误\n"); system("pause"); } Push(S,b-a); break; case'*': if(! Pop(S,a)){ printf("\n表达式错误\n"); system("pause"); } if(! Pop(S,b)){ printf("\n表达式错误\n"); system("pause"); } Push(S,a*b); break; case'/': if(! Pop(S,a)){ printf("\n表达式错误\n"); system("pause"); } if(! Pop(S,b)){ printf("\n表达式错误\n"); system("pause"); } Push(S,b/a); break; } } Statusevaluate(charch[],float&result) { SqStackS; StatusSt; inti; i=0; St=InitStack(S); while(ch[i]! ='#'&&i<100) { if(IsDigital(ch[i])) { i+=EvalValue(&ch[i],S); } elseif(ch[i]=='') i++; else{ EvalExpr(ch[i],S); i++; } } //如果到达表达式末尾时,栈中剩余元素不止一个,那么该 //后缀表达式是不正确的。 if(StackLength(S)==1) Pop(S,result); else{ //printf("表达式错误"); returnERROR; } returnOK; } main() { StatusSt; charch[100],c; inti=0; floatresult; printf("请输入表达式。 #表示结束\n"); while(i<100) { scanf("%c",&c); ch[i++]=c; if(c=='#') break; } St=evaluate(ch,result); if(St) printf("resultis%5.2f\n",result); else printf("\n表达式错误\n"); system("pause"); return0; }算法的时空分析 该算法的复杂度应该为O(n) 输入和输出的格式 请输入表达式。 #表示结束//输出 等待输入 Theresultis//输出结果的位置 四、调试分析 1开始填空时不明白EvalExpr函数的作用,后来助教老师解答了,写出相应代码 2程序运行时正确的表达式也会被判断为错误的表达式找出了错误并改正 五、测试结果 请输入表达式。 #表示结束 21+3*# resultis9.00 请输入表达式。 #表示结束 12+3*# resultis9.00 请输入表达式。 #表示结束 123-# 表达式错误 表达式错误 六、用户使用说明(可选) 1、本程序的运行环境为DOS操作系统,执行文件为gcd.exe 2、运行程序时 请输入表达式。 #表示结束 Theresultis: 七、实验心得(可选) 这一次实验之前,和班上一个同学交流了很久,我终于明白了,原来数据结构这门课程最大的目的就是教会我们怎么写出优秀的实验报告,而不是代码,我终于明白了为什么每一次实验之前老师会花那么多时间来讲解实验报告,于是,我把自己的实验报告从头到尾修改了一遍,把自认为不合格的地方修改了,以后要好好写实验报告了。 七、附录(可选) Gcd.c主程序 #include #include #include #include #include #defineSTACK_INIT_SIZE100// #defineSTACKINCREMENT10 #defineOK1 #defineTRUE1 #defineFALSE0 #defineERROR0 #defineOVERFLOW-2 typedeffloatSElemtype; typedefintStatus; typedefstruct { SElemtype*base; SElemtype*top; intstacksize; }SqStack; StatusInitStack(SqStack&S) { S.base=(SElemtype*)malloc(STACK_INIT_SIZE*sizeof(SElemtype)); if(! S.base)exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; returnOK; } intStackLength(SqStackS) { //获得堆栈元素的个数 //填空 returnS.top-S.base; } StatusPush(SqStack&S,SElemtypee) { //入栈 //填空 if(StackLength(S)>STACK_INIT_SIZE)//栈满,追加内存空间 returnFALSE; else//为栈顶插入元素e *++S.top=e; returnTRUE; } StatusPop(SqStack&S,SElemtype&e) { //出栈 //填空 if(StackLength(S)==0) returnERROR;//若空栈,返回错误 e=*S.top--; returnTRUE; } StatusIsDigital(charch) { if(ch>='0'&&ch<='9') { return1;//是数字字母 } return0;//不是数字字母 } intEvalValue(char*ch,SqStack&S) { inti=0; SElemtyperesult=0; chara; a=ch[i]; while(IsDigital(a)) { result=10*result+(int)(a-48); a=ch[++i]; } Push(S,result); returni; } voidEvalExpr(charch,SqStack&S) { //如果ch中保存的是操作符,则从堆栈中弹出两个元素,并把操作符应用在这两个元素之上, //然后把操作结果压入到栈中。 如果试图从栈中弹出两个元素是,该栈中并没有,那么该 //后缀表达式是不正确的。 //填空 SElemtypea,b; if(ch=='+') if(! Pop(S,a)||! Pop(S,b)) printf("表达式错误! \n"); elsePush(S,a+b); elseif(ch=='-') if(! Pop(S,a)||! Pop(S,b)) printf("表达式错误! \n"); elsePush(S,a-b); elseif(ch=='*') if(! Pop(S,a)||! Pop(S,b)) printf("表达式错误! \n"); elsePush(S,a*b); elseif(ch=='/') if(! Pop(S,a)||! Pop(S,b)) printf("表达式错误! \n"); elsePush(S,a/b); } Statusevaluate(charch[],float&result) { SqStackS; StatusSt; inti; i=0; St=InitStack(S); while(ch[i]! ='#'&&i<100) { if(IsDigital(ch[i])) { i+=EvalValue(&ch[i],S); } elseif(ch[i]=='') i++; else{ EvalExpr(ch[i],S); i++; } } //如果到达表达式末尾时,栈中剩余元素不止一个,那么该 //后缀表达式是不正确的。 if(StackLength(S)==1) Pop(S,result); else{ printf("表达式错误"); returnERROR; } returnOK; } main() { StatusSt; charch[100],c; inti=0; floatresult; while (1) { printf("请输入表达式。 #表示结束\n"); while(i<100) { scanf("%c",&c); ch[i++]=c; if(c=='#') break; } St=evaluate(ch,result); if(St) printf("resultis%5.2f\n",result); else printf("\n表达式错误\n"); } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程实验报告 实验3 数据结构 课程 实验 报告