栈的应用算法与数据结构课程设计Word格式文档下载.docx
- 文档编号:18027498
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:14
- 大小:69.81KB
栈的应用算法与数据结构课程设计Word格式文档下载.docx
《栈的应用算法与数据结构课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《栈的应用算法与数据结构课程设计Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
StatusStackEmpty1(SqStackS)
{if(S.top==S.base)
returnTRUE;
elsereturnFALSE;
/*求顺栈长度*/
intStackLength1(SqStackS)
{returnS.top-S.base;
/*取顺栈的栈顶元素(注意:
形参表与课本有差别)*/
SElemType1GetTop1(SqStackS)
{if(S.top==S.base)returnERROR;
return*(S.top-1);
/*入顺栈*/
StatusPush1(SqStack*S,SElemType1e)
{if((*S).top-(*S).base>
=(*S).StackSize)
{(*S).base=(SElemType1*)realloc((*S).base,((*S).StackSize+STACKINCREMENT)*sizeof(SElemType1));
(*S).top=(*S).base+(*S).StackSize;
(*S).StackSize+=STACKINCREMENT;
*((*S).top)=e;
(*S).top++;
/*出顺栈*/
StatusPop1(SqStack*S,SElemType1*e)
{if((*S).top==(*S).base)
returnERROR;
(*S).top--;
*e=*((*S).top);
/*定义链栈类型*/
typedefintSElemType2;
typedefstructSNode
{SElemType2data;
structSNode*next;
}SNode,*SLinkStack;
/*B2、初始化链栈*/
StatusInitStack2(SLinkStack*S)
{(*S)=(SLinkStack)malloc(sizeof(SNode));
(*S))exit(OVERFLOW);
(*S)->
next=NULL;
StatusStackEmpty2(SLinkStackS)
{if(!
(S->
next))
else
returnFALSE;
/*取顺栈的栈顶元素*/
SElemType2GetTop2(SLinkStackS)
{if(StackEmpty2(S))
returnS->
next->
data;
/*入链栈*/
StatusPush2(SLinkStack*S,SElemType2e)
{SLinkStackp;
p=(SLinkStack)malloc(sizeof(SNode));
p)exit(OVERFLOW);
p->
data=e;
next=(*S)->
next;
next=p;
/*出链栈*/
StatusPop2(SLinkStack*S,SElemType2*e)
(*S)->
next)return(ERROR);
*e=(*S)->
p=(*S)->
next=p->
free(p);
intbiao[7][7]={'
>
'
'
<
'
='
};
charop[7]={'
+'
'
-'
*'
/'
('
)'
#'
/*判断运算符号的优先级*/
charPrecede(charc1,charc2)
{inti,j,k;
for(k=0;
k<
7;
k++)
{
if(c1==op[k])i=k;
if(c2==op[k])j=k;
return(biao[i][j]);
//用上面运算优先关系表判断运算符号的优先关系
/*判断元素是不是运算符号*/
intIn(charc,char*p)//判断是不是运算符号
{inti=0;
while(i<
7)
if(c==p[i++])
return1;
return0;
/*计算运算式子*/
charOperate(inta,chartheta,intb)//计算运算式
{switch(theta)
case'
:
returna+b;
returna-b;
returna*b;
returna/b;
/*计算表达式求值*/
intEvaluateExpression()
{inta,b,y,flag;
charc,x,theta;
SqStackOPTR;
SLinkStackOPND;
InitStack1(&
OPTR);
Push1(&
OPTR,'
);
InitStack2(&
OPND);
c=getchar();
flag=0;
while(c!
||GetTop1(OPTR)!
)
if(!
In(c,op))//不是运算符进栈
{if(flag==0)
{Push2(&
OPND,c-'
0'
flag=1;
{Pop2(&
OPND,&
y);
y=y*10+c-'
;
Push2(&
OPND,y);
else
{flag=0;
switch(Precede(GetTop1(OPTR),c))
{case'
//脱括号并接收下一字符
OPTR,c);
break;
Pop1(&
OPTR,&
x);
//退栈并将运算结构入栈
theta);
Pop2(&
b);
a);
OPND,Operate(a,theta,b));
returnGetTop2(OPND);
voidmain()
{printf("
\nResult=%d\n"
EvaluateExpression());
2、车厢调度
顺序存储结构:
#defineN100
/*定义顺序栈类型*/
typedefintElemType;
{ElemType*base;
ElemType*top;
/*初始化顺序栈*/
voidInitStack(SqStack*S)
{S->
base=(ElemType*)malloc(N*sizeof(ElemType));
S->
base)exit(0);
S->
top=S->
base;
/*销毁顺序栈*/
voidDestroyStack(SqStack*S)
{free(S->
base);
/*清空顺序栈*/
voidClearStack(SqStack*S)
/*判断顺序栈是否为空*/
intStackEmpty(SqStackS)
elsereturn0;
/*求顺序栈长度,即元素个数.*/
intStackLength(SqStackS)
/*取顺序栈的栈顶元素*/
voidGetTop(SqStackS,ElemType*e)
{if(S.top>
S.base)*e=*(S.top-1);
/*元素压入顺序栈*/
voidPush(SqStack*S,ElemTypee)
{if(S->
top-S->
base<
N)
{*(S->
top)=e;
top++;
printf("
\n栈满"
/*元素弹出顺序栈*/
voidPop(SqStack*S,ElemType*e)
top>
base)
top--;
*e=*(S->
top);
/*遍历顺序栈并输出:
栈底向栈顶方向输出*/
voidStackTraverse(SqStackS)
\nStack:
"
while(S.base<
S.top)
{printf("
\t%d"
*(S.base));
S.base++;
}}
/*车厢调度*/
voidsearch(SqStacks1,SqStacks2,SqStacks3,inta)
{intx;
StackEmpty(s1))
{Pop(&
s1,&
//利用递归将栈s1元素入s2排序
Push(&
s2,x);
search(s1,s2,s3,a);
Pop(&
s2,&
//递归至s2排序完,s1中无元素将s2中入s1
s1,x);
StackEmpty(s2))
s3,x);
s3,&
if(StackLength(s3)==a)
StackTraverse(s3);
main()
{intn,i;
SqStacks1,s2,s3;
InitStack(&
s1);
s2);
s3);
请输车厢长度n:
scanf("
%d"
&
n);
for(i=n;
i>
=1;
i--)
s1,i);
车厢输出序列为:
search(s1,s2,s3,n);
system("
pause"
);
链式存储结构:
#include"
{ElemTypedata;
}SNode,*LinkStack;
/*初始化链栈(没有头结点)*/
voidInitStack(LinkStack*top)
{*top=NULL;
/*销毁链栈*/
voidDestroyStack(LinkStack*top)
{LinkStackp;
while(*top!
=NULL)
{p=*top;
*top=(*top)->
/*清空链栈*/
voidClearStack(LinkStack*top)
intStackEmpty(LinkStacktop)
{if(top==NULL)
/*求链栈长度*/
intStackLength(LinkStacktop)
intn=0;
p=top;
while(p!
{n++;
p=p->
returnn;
/*取链栈栈顶元素*/
voidGetTop(LinkStacktop,ElemType*e)
{if(top!
*e=top->
voidPush(LinkStack*top,ElemTypee)
{LinkStacknew;
new=(LinkStack)malloc(sizeof(SNode));
new->
next=*top;
*top=new;
voidPop(LinkStack*top,ElemType*e)
if(*top!
{*e=(*top)->
p=*top;
(*top)=p->
/*遍历链栈并输出:
栈顶向栈底方向输出*/
voidStackTraverse(LinkStacktop)
while(p)
p->
data);
voidsearch(LinkStacks1,LinkStacks2,LinkStacks3,inta)
LinkStacks1,s2,s3;
}
测试情况
1、表达式求值:
2、车厢调度:
顺序栈与链式栈的测试结果相同。
小结
通过本次课程设计,我学会了很多。
编程不像做其它事,它要求编程人员有非常缜密的思维,很好的整体把握能力和很好的调试程序的能力等。
在编写程序中间我们不仅要想好整个编程思路,打好框架,还需要考虑存储结构的适用性和程序的编写的简洁。
在大的方面弄好了,我们也要注意小小的细节问题,像在车厢调度问题中,我们在“search(LinkLists)”中写成了“*s”,而导致整个程序的错误,在编程中像这样的小问题很多,我编程习惯性在第一次写出程序后,用电脑运行来发现一些语法错误,再修改正确,这是我在编程中的一个不好的习惯,如果没有错误提示,我想这会花费我很多的时间去发现和修改小错误,这个习惯我也要努力改正,在编程中要注意细节方面的问题,这样能节省很多的时间,而且在编程中注意细节的问题也能为自己在其他的方面培养良好的习惯。
在这次课程设计中,我是写表达式求值的程序,表达式求值是程序设计编译中的一个最基本的问题,它的实现是栈应用的一个典型例子。
因为书本上有思想介绍,写起来并不是很费劲。
书上只有主要的运算表达式函数,我要补充运算符的判断,数值计算函数和优先级判断函数,主要的程序都是按照数值栈与运算符号栈的应用方法编写,上课时也有提主要的写法,编写起来主要是注意思路的正确与细节方面的问题。
我所写的“EvaluateExpression()”函数是按书上的程序编写,其中主要思想是符号选择入栈,数字入栈,符号要判断优先级再操作。
在写表达式求值中间,我感觉自己好像在编写计算器。
在我第一次完成程序的时候,修改完细节问题,并没有什么错误,但是在输入表达式的时候,不能显示运算结构,为此我前前后后又检查了好几遍程序,运行没错误,也没发现哪里写的思路是错误的,后来我找学习委员帮我改了下,程序和我之前写的没多大差别,后来在他运行给我看的时候才发现我一直少了一个“#”,表达式求值的程序在数值栈中是以“#”为结束标记,如果在输入表达式的时候没有输入结束标记就不能正确运行。
在编程中除了程序的
我们组组员的程序是车厢调度问题,是排序列车车厢序列,他们程序基本一样,只是采用不同的储存结构的栈来完成。
链式栈与顺序栈的函数调用基本类似,主要的列车排序程序是一样的的,车厢调度中要注意的主要是在利用栈排序的时候要用上递归思想,还有在函数参数是要注意带“*”还是不带,在编程中我们就范了类似的错误。
刚开始我们组有位同学发给我的程序是用数组完成的车厢调度而没用上栈的内容,其实编写表达式求值和车厢调度的方法有很多,不过在利用栈的应用编程,我们更加了解了栈的定义结构以及应用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 应用 算法 数据结构 课程设计