数据结构实验 栈的应用.docx
《数据结构实验 栈的应用.docx》由会员分享,可在线阅读,更多相关《数据结构实验 栈的应用.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构实验栈的应用
课程题目:
数据结构试验
学院:
班级:
姓名:
学号:
实验题目:
栈的应用
实验内容:
算术表达式求值
实验目的:
掌握栈和队列的概念及工作原理,运用其原理完成实验题目中的内容。
实验要求:
为了使学生更好的掌握与理解课堂上老师所讲的概念与原理,实验前每个学生要认真预习所做的实验内容及编写源程序伪码(写在纸上及盘中均可)
实验学时:
4学时
设计原理:
任何一个表达式都是有操作数、运算符和界限符组成的。
我们把运算符和界限符统称为算符,它们构成的集合命名为OP。
根据简单算术表达式的运算规则,在运算的每一步中,任意两个相继出现的算符a和b之间的优先关系至多是下面三种关系之一:
aa=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码问题。