数据结构实验 栈的应用.docx

上传人:b****7 文档编号:11325871 上传时间:2023-02-26 格式:DOCX 页数:14 大小:32.76KB
下载 相关 举报
数据结构实验 栈的应用.docx_第1页
第1页 / 共14页
数据结构实验 栈的应用.docx_第2页
第2页 / 共14页
数据结构实验 栈的应用.docx_第3页
第3页 / 共14页
数据结构实验 栈的应用.docx_第4页
第4页 / 共14页
数据结构实验 栈的应用.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构实验 栈的应用.docx

《数据结构实验 栈的应用.docx》由会员分享,可在线阅读,更多相关《数据结构实验 栈的应用.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构实验 栈的应用.docx

数据结构实验栈的应用

课程题目:

 

数据结构试验

 

学院:

班级:

姓名:

学号:

 

实验题目:

栈的应用

实验内容:

算术表达式求值

实验目的:

掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。

实验要求:

为了使学生更好的掌握与理解课堂上老师所讲的概念与原理,实验前每个学生要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可)

实验学时:

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码问题。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1