ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:207.27KB ,
资源ID:5675839      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5675839.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《栈的基本操作》数据结构设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《栈的基本操作》数据结构设计.docx

1、栈的基本操作数据结构设计届课程设计栈的基本操作课程设计论文学生姓名 学 号 所属学院 信息工程学院 专 业 计算机科学与技术 班 级 计算机 指导教师 教师职称 讲师 塔里木大学教务处制目录前言 11.1数据结构简介 1正文 12.1设计背景与意义 12.1.1栈的简介 12.1.2选择算法的原因与意义 22.2设计的原理和内容 22.2.1设计的原理 32.2.2设计的内容 33.1目标和总体方案 33.2 设计方法和内容 33.1.1设计流程图 43.1.2设计内容 44.1 程序的设计思想和内容 54.1.1程序设计的初始运行环境 54.1.2栈的初始化 54.1.3栈的插入 64.1.

2、4栈的删除 74.1.5取栈顶元素 74.2小结 8参考文献 8附录 9前言1.1数据结构简介在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。数据结构这一门课的内容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在

3、一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。记为:Data-Structure=(D,R)其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合。正文栈是这样一种数据类型,其主要属性是由支配其元素的插入与删除的规则来决定的,删除或移去的元素只能是最后插入的,即所谓具有后进先出(LIFO)性质或规范。2.1设计背景与意义2.1.1栈的简介栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性

4、表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。 栈可以用来在函数调用的时候存储断点,做递归时要用到栈! 以上定义是在经典计算机科学中的解释。 在计算机系统中,栈则是一个具有以上属性的动态内存

5、区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址增大,弹出的操作使得栈顶的地址减小。 栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。2.1.2选择算法的原因与意义一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。一个逻辑数据结构可以有多种存储

6、结构,且各种存储结构影响数据处理的效率。 在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。 选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数

7、据的存储结构实质上是它的逻辑结构在计算机存储器中的实现,为了全面的反映一个数据的逻辑结构,它在存储器中的映象包括两方面内容,即数据元素之间的信息和数据元素之间的关系。不同数据结构有其相应的若干运算。数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新和排序等。在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。不论哪种情况,选择合适的数据结构都是非常重要的。数据结构是我们重要的必修课程。当代社会学要大学培养出理论扎实,动手实践能力强的大学生。所以,本次课程设计的目的就在于通过一次实践性的活动加深对这门课程的理解,使我们在感性的认识上进一步升华为理性的认识。为后继

8、课程的学习打下坚实的基础。2.2设计的原理和内容图1 栈的入栈出栈顺序2.2.1设计的原理栈 (Stack):是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。假设S=(a1,a2,an),则称a1为栈底元素,an为栈顶元素。栈中元素按a1,a2,an的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是后进先出的原则进行的。因此,栈又称为后进先出的线性表。2.2.2设计的内容主要的设计思路就是完成对栈的操作,如栈的初始化、栈的插入、栈的删除、取栈顶元素、栈的退

9、出。进栈(PUSH)算法 若TOPn时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作); 置TOP=TOP+1(栈指针加1,指向进栈地址); S(TOP)=X,结束(X为新进栈的元素); 退栈(POP)算法 若TOP0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作); X=S(TOP),(退栈后的元素赋给X); TOP=TOP-1,结束(栈指针减1,指向栈顶)。3.1目标和总体方案栈是一种操作受限制的线性表,因此,可称为限制性的数据结构。但从数据结构角度看,它们是和线性表大不相同重要的抽象数据类型。栈是按照后进先出的原则进行初始化,插入

10、,删除栈的操作。此次,栈的目标是通过栈的后进先出原则将对栈的操作用程序语言形象的再现和描述出来,于是制定了一个总体方案。将这项工程分为两大部分:程序的设计和程序的调试。首先在程序的设计部分由分为几个步骤:第一步:查阅有关数据结构栈操作的资料。第二步:设计这个项目的整体架构和算法。第三步:选择一门程序设计语言进行算法的描述。其次,进行程序的调试。3.2 设计方法和内容有了总体方案后必须用一个事半功倍的设计方法来提高程序设计的效率。在这个项目的设计上,我选择了语言作为算法的描述语言,因为语言具有丰富的表达能力以及代码的高效性,并且有着良好的移植性和灵活性。同时,采用“自顶向下,个个击破”的程序设计

11、思路和思想,充分运用语言强大的功能。并将这个项目整体设分成了两个模块。一个是功能函数模块群,主要实现设计方案中的具体功能,是整个项目的执行部分;另一个是主函数模块,主要实现对数据流和控制流的控制,使整个项目的控制部分。这两大模块有机的结合共同构成了这个项目的全部面貌。3.1.1设计流程图 图2 设计流程图3.1.2设计内容 程序设计的基本算法介绍:1.栈是一种按照后进先出的原则进行的线性表,即后进栈的元素先处理,退栈的第一个元素应为栈顶元素。2.栈的基本操作(1)构造一个空栈S:InitStack(&S);(2)销毁栈S:DetroyStack(&S);(3)栈S的清空:ClearStack(

12、&S);(4)栈顶元素的返回:GetTop(S,&e);(5)插入元素e:Push(&S,e);(6)删除元素e:Pop(&S,&e);3.栈的存储和线性表类似,栈也有两种存储表示方法。这次设计用的是顺序存储结构,它是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便;另一方面,由于栈的使用过程中所需最大空间的大小很难估计,因此,一般来说,在初始化设空栈时不应限定栈的最大容量。一个较合理的做法是:先为栈分配一个基本容量,然

13、后再应用过程中,当栈的空间不够使用时再逐段扩大。为此。可设定两个常量:STACK_INIT_SIAE(存储空间初始分配量)和STACKKINCREMENT(存储空间分配增量),并以下属类型说明作为顺序栈的定义。typedef struct SElemType *base;SElemType *top; int stacksize;SqStack;其中,stacksize指示栈的当前可使用的最大容量。栈的初始化操作为:按设定的初始分配量进行第一次存储分配,base可称为栈底指针,在顺序栈中,它始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。称top为栈顶指针,其初始值指向栈底,

14、即top=base可作为栈空标记,每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。如图3展示了顺序栈中数据元素和栈顶指针之间的关系:图3 栈顶指针和栈中元素之间的关系top F E D top C top B B top base base base base A A A 4.1 程序的设计思想和内容 4.1.1程序设计的初始运行环境这个项目是由主函数模块和功能函数模块组成的。其中主函数模块是项目的控制部分,很重要的一个作用就是对整个程序的初始化功能。在设计初始运行环境时,为了每一次栈操作后都可以进行对程序的初始化,

15、采用了dowhile循环语句构成一个无限循环,使得每一次栈操作之后都可以将程序初始化重新选择对栈的另一个操作,例如:选择2,将若干个数据压入栈中之后,程序便又回到了初始的界面,我们可以选择4进行出栈操作。4.1.2栈的初始化其具体算法如下:Status InitstackSqstack &S) /构造一个空栈S S.base=(SElemType.*)malloc(STACK_INIT_SIZE *sizef(SElemType);If(!S.base) exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;/Ini

16、tStack具体运行截图为图4 运行图4.1.3栈的插入其具体算法如下:Status Push(SqStack &S, SElemType e) /插入元素e为新的栈顶元素If(S.top S.base=S.stacksize) /栈满,追加存储空间S.base=(SElemType *) realloc(S.base,(S.stacksiz+STACKINCREMENT)*sizef(SElemType);if(!S.base) exit(OVERFLOW); /存储分配失败S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;*S.top

17、+=e;Return OK;/push具体运行截图为:图5 运行图4.1.4栈的删除其具体算法为:Status Pop(SqStack &S,SElemType &e) /若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top=S.base)return ERROR; e=*-S.top;return OK;/Pop具体运行截图为:图6 运行图4.1.5取栈顶元素其具体算法为:Status GetTop(SqStack S,SElemType &e)/若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR If(S.top=S.base) ret

18、urn ERROR; e=*(S.top-1); return OK;/GetTop其具体运行截图为:图7 运行图4.2小结通过这次数据结构的课程设计,我学了很多在上课没考懂的知识,巩固了栈的知识,同时,又让我学会了如何的从网上查找资料和同学交流。虽然我对数据结构有一定的掌握,但是到了真正使用,做课设的时候还是遇到了许多的问题。在仔细研究过课设要求和功能需求后,我有了初步的想法。在整个设计过程中锻炼了对事情的分析能力,通过怎样解决过程中出现的问题提高了我们查找文献的能力、对网络资源的利用能力和其他同学的交流沟通能力了。到了这最后的阶段,有了这样一个课程设计,感觉挺好的,主要是加强对一个大程序的

19、宏观概念。一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。在设计过程中,和同学们相互探讨,相互学习,相互监督。我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益良多。课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。参考文献1严蔚敏,吴伟民编著,

20、数据结构(C语言版),清华大学出版社,2010年 2耿国华等.数据结构C语言描述,西安:西安电子科技大学出版社,2002 3许卓群等.数据结构与算法,北京:高等教育出版社,2005 4张乃孝等.算法与数据结构C语言描述,北京:高等教育出版社,2001 5范策等编著.算法与数据结构(C语言版),北京:机械工业出版社,2004 附录#include#include#define MAX 20#define ElemType int#define S (*p)struct SqStack ElemType elemMAX; int top;main() struct SqStack *q; int

21、number,u=1,n; int i,y,cord; ElemType a;int b100; void OutStack(struct SqStack S); void InitStack(struct SqStack *p); void Push(struct SqStack *p,ElemType x); ElemType Pop(struct SqStack *p); ElemType GetTop(struct SqStack *p); do printf(nn); printf(n主菜单: 1 初始化顺序栈 2 插入一个元素 3 删除栈顶元素 4 取栈顶元素 5 退出n); pr

22、intf(n请选择:); scanf(%d,&cord); switch(cord) case 1: q=(struct SqStack*)malloc(sizeof(struct SqStack); InitStack(q); OutStack(q); printf(n); break; case 2: printf(n); printf(请输入你想插入数据的个数:); scanf(%d,&number); printf(n你所要插入的数据个数为 %d 个n,number); printf(n); while(u=number) printf(n请输入要插入的数据 a=); printf(n

23、这是你第 %d 个输入的数据: ,u); scanf(%d,&a); printf(n); bu=a; Push(q,a); u+; printf(n你的输入顺序为:n); printf(n); printf(n); for(n=1;n=number;n+) printf(第%2d个输入的是:%6dn,n,bn); printf(n入栈的顺序:n); printf(n);printf(n); OutStack(q); printf(nn入栈操作结束,现在栈中已经有 %d 个数据,结果见菜单栏上部!,number); printf(n); break; case 3: u=1; printf(n

24、); printf(你想删除栈里的几个数据:); scanf(%d,&number); printf(n你所要插入的数据个数为 %d 个n,number); printf(n); printf( nn原来栈中的情况:n); printf(n); OutStack(q); while(u=number) Pop(q); u+; printf(n); printf(n现在栈中的情况:n); printf(n); OutStack(q); printf(n); break; case 4: u=1; printf(n); printf(你想出栈几个元素:); scanf(%d,&number); p

25、rintf(n); printf(将有 %d 个元素出栈 ,number ); printf(n); printf(n); printf(原先栈里的情况); printf(n); printf(n); OutStack(q); printf(n出栈的先后顺序:n); printf(n); while(u=number)y=GetTop(q); printf(n第%2d个出栈的是: y=%d,u,y); Pop(q); u+; printf(n); printf(n出栈后栈里的情况:n); printf(n); OutStack(q); printf(n); break; case 5: exit(0); while (cord=5);void InitStack(struct SqStack *p) if(!p) printf(Eorror); S.top=0;void Push(struct SqStack *p,ElemType x) if(S.top0;i-) printf(第%2d个入栈的元素 %6dn,i,S.elemi);

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

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