数据结构实验 栈的应用.docx
- 文档编号:11325871
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:14
- 大小:32.76KB
数据结构实验 栈的应用.docx
《数据结构实验 栈的应用.docx》由会员分享,可在线阅读,更多相关《数据结构实验 栈的应用.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构实验栈的应用
课程题目:
数据结构试验
学院:
班级:
姓名:
学号:
实验题目:
栈的应用
实验内容:
算术表达式求值
实验目的:
掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。
实验要求:
为了使学生更好的掌握与理解课堂上老师所讲的概念与原理,实验前每个学生要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可)
实验学时:
4学时
设计原理:
任何一个表达式都是有操作数、运算符和界限符组成的。
我们把运算符和界限符统称为算符,它们构成的集合命名为OP。
根据简单算术表达式的运算规则,在运算的每一步中,任意两个相继出现的算符a和b之间的优先关系至多是下面三种关系之一:
a a=ba的优先权等于b ab+ - * / ( ) # +> > < < < > > - > > < < < > > * > > > > < > > / > > > > < > > ( < < < < < = ) > > > > > > # < < < < < = a>ba的优先权大于b 为实现算符优先算法,可以使用两个工作栈。 一个为OPTR,用以寄存预算符;另一个为OPND,用以寄存操作数或运算结果。 算法基本思想: .首先置操作数栈为空栈,表达式起始运算符“#”为运算符栈的基本元素; .依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权执行相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为“#”)。 详细程序清单及注释说明: #include #include #include #include #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineINFEASIBLE-1 #defineOVERFLOW-2 #defineSTACK_INIT_SIZE100 //初始量分配 #defineSTACKINCREMENT10 //存储空间的分配增量 typedefstruct { char*base; char*top; intstacksize; }sqstack; intinitstack(sqstack&s) { //创造一个空栈S s.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char)); if(! s.base)exit(OVERFLOW); s.top=s.base; s.stacksize=STACK_INIT_SIZE; returnOK; } intpush(sqstack&s,chare) { //插入e为新的栈顶元素 if(s.top-s.base>=s.stacksize) { s.base=(char*)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(char)); if(! s.base)exit(OVERFLOW); s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } *s.top++=e; returnOK; } intpop(sqstack&s,char&e) { //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(s.top==s.base)returnERROR; e=*--s.top; returnOK; } intgettop(sqstacks) { chare; if(s.top==s.base)returnERROR; e=*(s.top-1); returne; } charin(chargetchar) { if(getchar>='#'&&getchar<='/') returnOK; else returnERROR; } charprecede(charoptrchar,chargetchar1) { if(optrchar=='+') { switch(getchar1) { case'+': return'>';break; case'-': return'>';break; case'*': return'<';break; case'/': return'<';break; case'(': return'<';break; case')': return'>';break; case'#': return'>';break; } } if(optrchar=='-') { switch(getchar1) { case'+': return'>';break; case'-': return'>';break; case'*': return'<';break; case'/': return'<';break; case'(': return'<';break; case')': return'>';break; case'#': return'>';break; } } if(optrchar=='*') { switch(getchar1) { case'+': return'>';break; case'-': return'>';break; case'*': return'>';break; case'/': return'>';break; case'(': return'<';break; case')': return'>';break; case'#': return'>';break; } } if(optrchar=='/') { switch(getchar1) { case'+': return'>';break; case'-': return'>';break; case'*': return'>';break; case'/': return'>';break; case'(': return'<';break; case')': return'>';break; case'#': return'>';break; } } if(optrchar=='(') { switch(getchar1) { case'+': return'<';break; case'-': return'<';break; case'*': return'<';break; case'/': return'<';break; case'(': return'<';break; case')': return'=';break; } } if(optrchar==')') { switch(getchar1) { case'+': return'>';break; case'-': return'>';break; case'*': return'>';break; case'/': return'>';break; case')': return'>';break; case'#': return'>';break; } } if(optrchar='#') { switch(getchar1) { case'+': return'<';break; case'-': return'<';break; case'*': return'<';break; case'/': return'<';break; case'(': return'<';break; case'#': return'=';break; } } } charoperate(charx,chary,charz) { if(x>47)x=atoi(&x); if(z>47)z=atoi(&z); switch(y) { case'+': returnx+z;break; case'-': returnx-z;break; case'*': returnx*z;break; case'/': returnx/z;break; } } charEvaluateExpression() { chartheta; chara,b,c; sqstackOPTR; sqstackOPND; initstack(OPTR); push(OPTR,'#'); initstack(OPND); c=getchar(); while(c! ='#'||gettop(OPTR)! ='#') { if(! in(c)) { push(OPND,c); c=getchar(); } else switch(precede(gettop(OPTR),c)) { case'<': push(OPTR,c);c=getchar();break; case'=': pop(OPTR,c);c=getchar();break; case'>': pop(OPTR,theta); pop(OPND,b);pop(OPND,a); push(OPND,operate(a,theta,b)); break; } } returngettop(OPND); } main() { loop: chara; printf("输入算式: (输入#结束)\n"); intvalue; value=(int)EvaluateExpression(); printf("计算结果为: %d\n",value); printf("继续计算? (输入1继续/输入0结束)"); scanf("%d",&a); if(a==1) gotoloop; else returnERROR; } 运行与测试及结果: 试验中所遇到的问题及解决办法: .实验当中遇到了程序显示结果和实际运算结果不相符的情况。 经查找,是由于运算符优先权设置时出现错误,导致程序对所输入的运算符号的判别出现错误,从而导致运算错误,更正运算符优先权判断逻辑后,程序运行正常。 .编写程序中遇到了程序结果不能输出的情况。 这个错误是由于对字符输入计算机后的处理没有了解清楚,字符输入到计算机中后,是以ASCLL码的形式存在的,故在编写函数时,应该考虑字符的ASCLL码问题。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验 栈的应用 数据结构 实验 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)