栈及其操作.docx
《栈及其操作.docx》由会员分享,可在线阅读,更多相关《栈及其操作.docx(8页珍藏版)》请在冰豆网上搜索。
栈及其操作
《高级语言程序设计》
课程设计报告
题目:
栈及其操作
专业:
班级:
姓名:
指导教师:
成绩:
计算机与信息工程系
2014年6月20日
1设计内容及要求
本次课程设计的主要目的是利用C程序设计语言实现栈类的基本操作,使得
整个程序可以完成出栈、进栈、获取栈顶元素、清空栈等一系列基本操作,也可以通过此次实训巩固C语言程序设计中的很多知识点,要求学生仔细分析设计题目,并画出程序流程图,编写程序源代码。
学会积极上机调试源程序,增强编程技巧与调程能力。
认真书写课程设计预习报告,课程设计说明书。
对于栈而言,它是程序设计语言中的有力工具。
然而,栈又分为顺序栈和链栈。
此次课程设计着重于顺序栈的基本操作。
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈低到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈的位置。
通过对顺序栈的实现进而对栈进行栈的基本操作。
构造一个顺序栈,对其进行入栈、出栈、取栈顶元素、清空和销毁栈等基本操作。
并且输出运行结果。
进栈出栈就像只有一个口的长筒,先把数据一个个放入筒内,而拿出的时候只有先拿走上边的,才能拿走下边的。
我们通常做到:
进栈后不再出栈。
2概要设计
将理论教学中涉及到的知识点贯穿起来,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
栈结构所具有的“后进先出”特性,使得栈成为程序设计语言中的有力工具。
栈还有一个非常重要的应用就是在程序设计语言中用来实现递归,当递归函数调用时,应按照“后调用先返回”的原则处理调用过程,因此函数之间的信息传递和控制转移必须通过栈来实现,递归工作栈是实现递归的核心技术。
先为栈分配一个基本容量,并给存储空间分配增量当栈的空间不够使用时再逐段扩大。
其中stacksize指示的是栈的当前可使用的最大容量。
而false和true分别指的是栈是否为空,false为1反之亦然;error和ok则是指栈中元素是否可以返回即栈底元素是否为零,error为1反之亦然。
分别对从一到十二等十二个元素进行压栈然后弹栈,每当插入新的栈顶元素时,指针top增1;删除栈顶元素时即弹栈时指针top减1,因此非空栈中的栈顶指针始终在栈顶元素的下一个位置上。
最后进行销毁栈的操作,并手动构造一个栈,输入想构造的栈里所包含的元素个数然后进行相应的栈的操作得到运行结果。
在程序的开头,将会设置一些宏定义来方便程序代码的运行,也会在适当地方加注备注方便理解,争取做到最好。
3设计过程
3.1流程图
3.2程序代码
#defineERROR0
#defineOVERFLOW-2
#defineStack_init_size100
#defineStackincrement10
#include
#include
typedefintSElemType;
typedefstruct
{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
voidmain()
{
SElemTypee;
SqStackS;
voidInitStack(SqStack*S);
/*构造栈的声明*/
intGetTop(SqStack*S,SElemTypee);
/*取栈顶元素函数声明*/
voidPush(SqStack*S,SElemTypee);
/*进栈函数声明*/
intPop(SqStack*S,SElemTypee);
/*弹出栈顶元素函数声明*/
printf("构造一个栈并读入数据:
\n");
InitStack(&S);/*构造栈*/
GetTop(&S,e);/*取栈顶元素*/
Push(&S,e);/*进栈*/
Pop(&S,e);/*弹出栈顶元素*/
printf("\n");
GetTop(&S,e);/*取栈顶元素*/
}
voidInitStack(SqStack*S)/*构造栈*/
{
inti,n;
SElemTypee;
S->base=(SElemType*)malloc
(Stack_init_size*sizeof(SElemType));
if(!
(*S).base)
S->top=S->base;
S->stacksize=Stack_init_size;
printf("请输入要读入栈内的数据个数:
")
scanf("%d",&n);
if(n>=S->stacksize)
{
S->base=(SElemType*)realloc
(S->base,(S->stacksize+Stackincrement)*sizeof(SElemType));
}
for(i=0;i{
printf("输入元素:
");
scanf("%d",&e);
*(S->top)=e;
S->top=S->top+1;
}
}
intGetTop(SqStack*S,SElemTypee)/*取栈顶元素函数*/
{
if(S->top==S->base)
returnERROR;
e=*(S->top-1);
printf("取出栈顶元素:
%d\n",e);
}
voidPush(SqStack*S,SElemTypee)/*进栈函数*/
{
if(S->top-S->base>=S->stacksize)
{
S->base=(SElemType*)realloc
(S->base,(S->stacksize+Stackincrement)*sizeof(SElemType));
if(!
(*S).base)
S->top=S->base+S->stacksize;
S->stacksize=S->stacksize+Stackincrement;
}
printf("请输入要插入的栈顶元素:
");
scanf("%d",&e);
*S->top=e;
S->top++;
}
intPop(SqStack*S,SElemTypee)
/*弹出栈顶元素函数*/
{
if(S->top==S->base)
returnERROR;
S->top--;
e=*S->top;
printf("要删除栈顶元素:
%d",e);
}
4设计结果与分析
在此,构造了一个栈内数据元素个数为5的栈,分别输入了进栈元素。
由程序运行取出栈顶元素相继输入要插入的栈顶元素,运行程序。
在输入栈内的数据个数为五的情况下,依次读入数据,按回车键结束一个元素的输入,并根据提示进行相应操作。
我们在读入数据后,程序会主动进行关于栈的基本操作,操作完成即退出。
5小结
在本课程设计的设计过程中,我刚开始感觉到有点头痛。
要通过一学期C语言的学习后将所学知识运用起来有点困难,但回过头来再去看教课书,对于这些知识点有关的背景,概念和解决方案更进一步的理解,感觉也不是很难。
另外我还体会了从事C语言课程设计工作需要特别谨慎认真地态度和作风,一点都不能马虎。
这次课程设计的意义对我来说却很重要,让我明白了很多。
我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正的掌握,从而提高自己的实际动手能力和独立思考的能力。
今后我要多加实践,把理论和实践完美结合起来,争取去达到另一个高度。
6参考文献
[1]谭浩强著.C程序设计(第二版).北京:
清华大学出版社,1999
[2]谭浩强,张基温,唐永炎编著.C语言程序设计.北京:
高等教育出版社,1992
[3]谭浩强编著.QBASIC语言教程.北京:
电子工业出版社,1997
[4]谭浩强.C程序设计[M].3版.北京:
清华大学出版社,2005
[5]HerbertSchildt著.戴健鹏译.C语言大全(第二版).北京:
电子工业出版社,1994
[6][美]SCHILDTH.C语言大全[M].4版.王子恢等译.北京:
电子工业出版社,2001