版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《数据结构》实验报告◎实验题目:栈的应用。◎实验目的:熟悉掌握对栈的应用和基本操作。◎实验内容:用算符优先法对算术表达式求值。一、需求分析通过程序设计实现算符优先法:1以字符串的形式输入整形数据和运算符号;2、输出算术表达式的结果;3、实现简单的一位整型数据的算术运算;4、测试数据:算术表达式,其中的整型数据均只有一位。二概要设计
1.基本操作 voidInitStack(SqStack*s) 操作结果:栈的初始化。 intGetTop(SqStack*s) 初始条件:栈已存在且不空; 操作结果:将栈顶元素返回。 voidPush(SqStack*s,inte) 初始条件:栈已存在; 操作结果:插入e作为新的栈顶元素。 charPop1(SqStack*s) 初始条件:运算符栈已存在且不空; 操作结果:栈顶元素出栈。 intPop2(SqStack*s) 初始条件:运算数栈已存在且不空; 操作结果:栈顶元素出栈。 charprecede(charA,charB) 操作结果:比较两个算符的优先级,并将比较结果返回。 intIn(charTest) 操作结果:判断字符是否是运算符。 intEvaluateExpression() 操作结果:通过调用一系列的函数,对表达式求值。 main() 操作结果:主要通过调用函数EvaluateExpression得到最终结果。2.本程序包含两个模块:(1)构造栈的模块;(2)主程序模块;(三)详细设计1.声明,栈的结构体和判断运算符优先级的表格(以数组形式表达):typedefstruct{ int*base; int*top; intstacksize;}SqStack;#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10#defineoverflow1#defineerror0charOPSET[7]={'+','-','*','/','(',')','#'};//运算符种类unsignedcharPrior[7][7]= {//算符间的优先关系 '>','>','<','<','<','>','>', '>','>','<','<','<','>','>', '>','>','>','>','<','>','>', '>','>','>','>','<','>','>', '<','<','<','<','<','=','', '>','>','>','>','','>','>', '<','<','<','<','<','','=' };2.各个函数的详细设计:voidInitStack(SqStack*s)//栈的初始化{ s->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)); if(!s->base)exit(error);//存储分配失败 s->top=s->base; s->stacksize=STACK_INIT_SIZE;}intGetTop(SqStack*s)//若运算符栈不空则用e返回栈顶元素{ if(s->top==s->base) exit(overflow); return(*(s->top-1));}voidPush(SqStack*s,inte)//插入e为新的栈顶元素{ if(s->top-s->base>=s->stacksize) { s->base=(int*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int)); if(!s->base)exit(error); s->top=s->base+s->stacksize;; s->stacksize=s->stacksize+STACKINCREMENT; } *s->top=e; s->top++;}charPop1(SqStack*s)//运算符栈顶元素出栈{ if(s->top==s->base) returnerror; return(*--s->top);}intPop2(SqStack*s)//运算数栈顶元素出栈{ if(s->top==s->base) returnerror; return(*--s->top);}charPrecede(charA,charB)//实现两个算符优先级的比较{ returnPrior[FindOpOrd(A,OPSET)][FindOpOrd(B,OPSET)];}在Precede函数中再调用FindOpOrd函数,设计如下:intFindOpOrd(charop,char*TestOp)//在Prior数组中按行或者按列找到算符对应的位置{ inti; for(i=0;i<7;i++) { if(op==TestOp[i]) returni; }}intOperate(inta,unsignedchartheta,intb)//根据运算符进行二元运算{switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':if(b!=0) returna/b; else exit(error);default:returnerror;}}intIn(charTest)//判断字符是否为运算符,如果是运算符返回1,否则返回0{if('0'<=Test&&Test<='9') return0;else return1;}intEvaluateExpression()//算符优先法的实现{SqStackOPTR,OPND; charc,theta;inta,b,result;InitStack(&OPTR);//创建运算符栈Push(&OPTR,'#');//在运算符栈栈底放上#InitStack(&OPND);//创建运算数栈c=getchar();while(c!='#'||GetTop(&OPTR)!='#'){if(In(c)==0)//不是运算符则进栈 { Push(&OPND,c-48); printf(" 运算数%d直接进运算数栈\n",c-48); c=getchar();} else {switch(Precede(GetTop(&OPTR),c)) {case'<'://栈顶元素优先级低Push(&OPTR,c); printf(" 运算符%c直接进运算符栈\n",c);c=getchar();break;case'='://脱括号并接收下一字符Pop1(&OPTR); printf(" 输入)后运算符栈进行脱括号操作\n");c=getchar();break;case'>'://退栈并将运算结果入栈theta=Pop1(&OPTR); printf(" 运算符%c从运算符栈顶弹出\n",theta);b=Pop2(&OPND); printf(" 运算数%d从运算数栈顶弹出\n",b);a=Pop2(&OPND); printf(" 运算数%d从运算数栈顶弹出\n",a);Push(&OPND,Operate(a,theta,b)); printf(" 运算数%d和运算数%d进行%c运算并将结果进运算数栈\n",a,b,theta);break;}//switch}}//whilereturn(Pop2(&OPND));}//EvaluateExpression函数EvaluateExpression通过调用其它函数实现了算符优先法计算表达式,因此主函数主要通过调用该函数进行运算。intmain(){ intresult; printf("请输入表达式(以#表示输入结束):\n"); result=EvaluateExpression(); printf("result=%d\n",result); return0;}3.完整的程序见源文件。(四)程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.0。(2)进入演示程序后即显示提示信息: 请输入表达式(以#表示输入结束):例如输入:3+2*(5+8)#点击回车即可得到结果及运算过程。(3)运行界面如图所示:(五)、实验总结(实验心得)1.关于函数调用过程中要注意参数的传递,以及函数的返回值问题。特别应注意参数类型和返回值的类型。2.在设计比较两个运算符优先级函数Precede的过程中花费时间长,最后采用直接将
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖南高速养护工程有限公司社会招聘任务型劳动合同制员工的46人笔试备考题库及答案解析
- 2026年芜湖无为市蜀山镇公开选拔村级后备干部12名笔试备考题库及答案解析
- 2026浙商中拓集团股份有限公司社会招聘19人笔试备考试题及答案解析
- 2026年石家庄信息工程职业学院单招职业技能考试备考题库含详细答案解析
- 2026四川长虹民生物流股份有限公司招聘货运专员岗位的1人笔试备考题库及答案解析
- 2026年福建莆田市城厢区顶墩实验学校中小学编外教师自主招聘若干人笔试备考试题及答案解析
- 2026年内蒙古商贸职业学院单招综合素质考试备考试题含详细答案解析
- 2026西藏华泰龙矿业开发有限公司招聘39人笔试备考题库及答案解析
- 2026浙江宁波市鄞州区公立学校招聘编外员工1人笔试备考题库及答案解析
- 2026农业农村部国际交流中心面向社会招聘编制外人员招聘2人笔试备考题库及答案解析
- 2026及未来5年中国电力工程总承包行业市场竞争态势及未来趋势研判报告
- 预备役介绍课件
- 2026元旦主题班会:马年猜猜乐新春祝福版 教学课件
- 四川省2025年高职单招职业技能综合测试(中职类)纺织服装类试卷(含答案解析)
- 2025年及未来5年市场数据中国磷化铟行业市场调研分析及投资战略咨询报告
- 《老年人误吸的预防专家共识》解读2
- 2025亚洲智能手机显现模块制造行业产能地理分布及供应链调整规划
- 项目二各类食物的营养价值9认识“五菜为充”(教案)-《食品营养与卫生》(高教第二版)同步课堂
- 非营利组织内部管理制度
- 2025年低速电动汽车市场分析报告
- 病原学标本送检及采集规范
评论
0/150
提交评论