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

上传人:b****6 文档编号:5675839 上传时间:2022-12-31 格式:DOCX 页数:17 大小:207.27KB
下载 相关 举报
《栈的基本操作》数据结构设计.docx_第1页
第1页 / 共17页
《栈的基本操作》数据结构设计.docx_第2页
第2页 / 共17页
《栈的基本操作》数据结构设计.docx_第3页
第3页 / 共17页
《栈的基本操作》数据结构设计.docx_第4页
第4页 / 共17页
《栈的基本操作》数据结构设计.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

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

《《栈的基本操作》数据结构设计.docx》由会员分享,可在线阅读,更多相关《《栈的基本操作》数据结构设计.docx(17页珍藏版)》请在冰豆网上搜索。

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

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

届课程设计

 

《栈的基本操作》

课程设计论文

 

学生姓名

学号

所属学院信息工程学院

专业计算机科学与技术

班级计算机

指导教师

教师职称讲师

 

塔里木大学教务处制

目录

前言1

1.1数据结构简介1

正文1

2.1设计背景与意义1

2.1.1栈的简介1

2.1.2选择算法的原因与意义2

2.2设计的原理和内容2

2.2.1设计的原理3

2.2.2设计的内容3

3.1目标和总体方案3

3.2设计方法和内容3

3.1.1设计流程图4

3.1.2设计内容4

4.1程序的设计思想和内容5

4.1.1程序设计的初始运行环境5

4.1.2栈的初始化5

4.1.3栈的插入6

4.1.4栈的删除7

4.1.5取栈顶元素7

4.2小结8

参考文献8

附录9

前言

1.1数据结构简介

在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。

“数据结构”在计算机科学中是一门综合性的专业基础课。

数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。

数据结构这一门课的内容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。

数据结构是计算机存储、组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

数据结构往往同高效的检索算法和索引技术有关。

数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。

记为:

Data-Structure=(D,R)其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合。

 

正文

栈是这样一种数据类型,其主要属性是由支配其元素的插入与删除的规则来决定的,删除或移去的元素只能是最后插入的,即所谓具有后进先出(LIFO)性质或规范。

2.1设计背景与意义

2.1.1栈的简介

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。

它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

  

栈是允许在同一端进行插入和删除操作的特殊线性表。

允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。

插入一般称为进栈(PUSH),删除则称为退栈(POP)。

栈也称为后进先出表。

  

栈可以用来在函数调用的时候存储断点,做递归时要用到栈!

  

以上定义是在经典计算机科学中的解释。

  

在计算机系统中,栈则是一个具有以上属性的动态内存区域。

程序可以将数据压入栈中,也可以将数据从栈顶弹出。

在i386机器中,栈顶由称为esp的寄存器进行定位。

压栈的操作使得栈顶的地址增大,弹出的操作使得栈顶的地址减小。

  

栈在程序的运行中有着举足轻重的作用。

最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。

2.1.2选择算法的原因与意义

一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。

对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。

一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率。

  

在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。

许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。

许多时候,确定了数据结构后,算法就容易得到了。

有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。

不论哪种情况,选择合适的数据结构都是非常重要的。

  

选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。

这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。

算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。

数据的存储结构实质上是它的逻辑结构在计算机存储器中的实现,为了全面的反映一个数据的逻辑结构,它在存储器中的映象包括两方面内容,即数据元素之间的信息和数据元素之间的关系。

不同数据结构有其相应的若干运算。

数据的运算是在数据的逻辑结构上定义的操作算法,如检索、插入、删除、更新和排序等。

在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。

不论哪种情况,选择合适的数据结构都是非常重要的。

《数据结构》是我们重要的必修课程。

当代社会学要大学培养出理论扎实,动手实践能力强的大学生。

所以,本次课程设计的目的就在于通过一次实践性的活动加深对这门课程的理解,使我们在感性的认识上进一步升华为理性的认识。

为后继课程的学习打下坚实的基础。

2.2设计的原理和内容

图1栈的入栈出栈顺序

2.2.1设计的原理

栈(Stack):

是只能在某一端插入和删除的特殊线性表。

它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

假设S=(a1,a2,…,an),则称a1为栈底元素,an为栈顶元素。

栈中元素按a1,a2,…,an的次序进栈,退栈的第一个元素应为栈顶元素。

换句话说,栈的修改是后进先出的原则进行的。

因此,栈又称为后进先出的线性表。

2.2.2设计的内容

主要的设计思路就是完成对栈的操作,如栈的初始化、栈的插入、栈的删除、取栈顶元素、栈的退出。

进栈(PUSH)算法  

若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);  

②置TOP=TOP+1(栈指针加1,指向进栈地址);  

③S(TOP)=X,结束(X为新进栈的元素);  

退栈(POP)算法 

①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈,空则下溢;不空则作②);  

②X=S(TOP),(退栈后的元素赋给X);  

③TOP=TOP-1,结束(栈指针减1,指向栈顶)。

3.1目标和总体方案

栈是一种操作受限制的线性表,因此,可称为限制性的数据结构。

但从数据结构角度看,它们是和线性表大不相同重要的抽象数据类型。

栈是按照后进先出的原则进行初始化,插入,删除栈的操作。

此次,栈的目标是通过栈的后进先出原则将对栈的操作用程序语言形象的再现和描述出来,于是制定了一个总体方案。

将这项工程分为两大部分:

程序的设计和程序的调试。

首先在程序的设计部分由分为几个步骤:

第一步:

查阅有关数据结构栈操作的资料。

第二步:

设计这个项目的整体架构和算法。

第三步:

选择一门程序设计语言进行算法的描述。

其次,进行程序的调试。

3.2设计方法和内容

有了总体方案后必须用一个事半功倍的设计方法来提高程序设计的效率。

在这个项目的设计上,我选择了C语言作为算法的描述语言,因为C语言具有丰富的表达能力以及代码的高效性,并且有着良好的移植性和灵活性。

同时,采用“自顶向下,个个击破”的程序设计思路和思想,充分运用C语言强大的功能。

并将这个项目整体设分成了两个模块。

一个是功能函数模块群,主要实现设计方案中的具体功能,是整个项目的执行部分;另一个是主函数模块,主要实现对数据流和控制流的控制,使整个项目的控制部分。

这两大模块有机的结合共同构成了这个项目的全部面貌。

3.1.1设计流程图

图2设计流程图

3.1.2设计内容

程序设计的基本算法介绍:

1.栈是一种按照后进先出的原则进行的线性表,即后进栈的元素先处理,退栈的第一个元素应为栈顶元素。

2.栈的基本操作

(1)构造一个空栈S:

InitStack(&S);

(2)销毁栈S:

DetroyStack(&S);

(3)栈S的清空:

ClearStack(&S);

(4)栈顶元素的返回:

GetTop(S,&e);

(5)插入元素e:

Push(&S,e);

(6)删除元素e:

Pop(&S,&e);

3.栈的存储

和线性表类似,栈也有两种存储表示方法。

这次设计用的是顺序存储结构,它是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。

通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便;另一方面,由于栈的使用过程中所需最大空间的大小很难估计,因此,一般来说,在初始化设空栈时不应限定栈的最大容量。

一个较合理的做法是:

先为栈分配一个基本容量,然后再应用过程中,当栈的空间不够使用时再逐段扩大。

为此。

可设定两个常量:

STACK_INIT_SIAE(存储空间初始分配量)和STACKKINCREMENT(存储空间分配增量),并以下属类型说明作为顺序栈的定义。

typedefstruct{

SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

其中,stacksize指示栈的当前可使用的最大容量。

栈的初始化操作为:

按设定的初始分配量进行第一次存储分配,base可称为栈底指针,在顺序栈中,它始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。

称top为栈顶指针,其初始值指向栈底,即top=base可作为栈空标记,每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上。

如图3展示了顺序栈中数据元素和栈顶指针之间的关系:

图3栈顶指针和栈中元素之间的关系

top

F

E

Dtop

C

topBB

topbasebase

basebaseA

AA

4.1程序的设计思想和内容

4.1.1程序设计的初始运行环境

这个项目是由主函数模块和功能函数模块组成的。

其中主函数模块是项目的控制部分,很重要的一个作用就是对整个程序的初始化功能。

在设计初始运行环境时,为了每一次栈操作后都可以进行对程序的初始化,采用了do…while循环语句构成一个无限循环,使得每一次栈操作之后都可以将程序初始化重新选择对栈的另一个操作,例如:

选择2,将若干个数据压入栈中之后,程序便又回到了初始的界面,我们可以选择4进行出栈操作。

4.1.2栈的初始化

其具体算法如下:

StatusInitstackSqstack&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;

returnOK;

}//InitStack

具体运行截图为

图4运行图

4.1.3栈的插入

其具体算法如下:

StatusPush(SqStack&S,SElemTypee){//插入元素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++=e;

ReturnOK;

}//push

具体运行截图为:

图5运行图

4.1.4栈的删除

其具体算法为:

StatusPop(SqStack&S,SElemType&e){

//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

if(S.top==S.base)returnERROR;

e=*--S.top;

returnOK;

}//Pop

具体运行截图为:

图6运行图

4.1.5取栈顶元素

其具体算法为:

StatusGetTop(SqStackS,SElemType&e){

//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

If(S.top==S.base)returnERROR;

e=*(S.top-1);

returnOK;

}//GetTop

其具体运行截图为:

图7运行图

4.2小结

通过这次数据结构的课程设计,我学了很多在上课没考懂的知识,巩固了栈的知识,同时,又让我学会了如何的从网上查找资料和同学交流。

虽然我对数据结构有一定的掌握,但是到了真正使用,做课设的时候还是遇到了许多的问题。

在仔细研究过课设要求和功能需求后,我有了初步的想法。

在整个设计过程中锻炼了对事情的分析能力,通过怎样解决过程中出现的问题提高了我们查找文献的能力、对网络资源的利用能力和其他同学的交流沟通能力了。

到了这最后的阶段,有了这样一个课程设计,感觉挺好的,主要是加强对一个大程序的宏观概念。

一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。

在设计过程中,和同学们相互探讨,相互学习,相互监督。

我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益良多。

课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。

 

参考文献

[1]严蔚敏,吴伟民编著,数据结构(C语言版),清华大学出版社,2010年

[2]耿国华等.数据结构——C语言描述,西安:

西安电子科技大学出版社,2002

[3]许卓群等.数据结构与算法,北京:

高等教育出版社,2005

[4]张乃孝等.算法与数据结构-C语言描述,北京:

高等教育出版社,2001

[5]范策等编著.算法与数据结构(C语言版),北京:

机械工业出版社,2004

附录

#include

#include

#defineMAX20

#defineElemTypeint

#defineS(*p)

structSqStack

{

ElemTypeelem[MAX];

inttop;

};

main()

{

structSqStack*q;

intnumber,u=1,n;

inti,y,cord;

ElemTypea;

intb[100];

voidOutStack(structSqStackS);

voidInitStack(structSqStack*p);

voidPush(structSqStack*p,ElemTypex);

ElemTypePop(structSqStack*p);

ElemTypeGetTop(structSqStack*p);

do{

printf("\n\n");

printf("\n主菜单:

1初始化顺序栈2插入一个元素3删除栈顶元素4取栈顶元素5退出\n");

printf("\n[请选择]:

");

scanf("%d",&cord);

switch(cord)

{

case1:

{

q=(structSqStack*)malloc(sizeof(structSqStack));

InitStack(q);

OutStack(q);

printf("\n");

}break;

case2:

{

printf("\n");

printf("请输入你想插入数据的个数:

");

scanf("%d",&number);

printf("\n你所要插入的数据个数为%d个\n",number);

printf("\n");

while(u<=number){

printf("\n请输入要插入的数据a=");

printf("\n这是你第%d个输入的数据:

",u);

scanf("%d",&a);

printf("\n");

b[u]=a;

Push(q,a);

u++;

}

printf("\n你的输入顺序为:

\n");

printf("\n");

printf("\n");

for(n=1;n<=number;n++)

printf("第%2d个输入的是:

 %6d\n",n,b[n]);

printf("\n入栈的顺序:

\n");

printf("\n");

printf("\n");

OutStack(q);

printf("\n\n入栈操作结束,现在栈中已经有%d个数据,结果见菜单栏上部!

",number);

printf("\n");

}break;

case3:

{

u=1;

printf("\n");

printf("你想删除栈里的几个数据:

");

scanf("%d",&number);

printf("\n你所要插入的数据个数为%d个\n",number);

printf("\n");

printf("\n\n原来栈中的情况:

\n");

printf("\n");

OutStack(q);

while(u<=number){

Pop(q);

u++;

}

printf("\n");

printf("\n现在栈中的情况:

\n");

printf("\n");

OutStack(q);

printf("\n");

}break;

case4:

{

u=1;

printf("\n");

printf("你想出栈几个元素:

");

scanf("%d",&number);

printf("\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;

case5:

exit(0);

}

}while(cord<=5);

}

voidInitStack(structSqStack*p)

{

if(!

p)

printf("Eorror");

S.top=0;

}

voidPush(structSqStack*p,ElemTypex)

{

if(S.top

{

S.top=S.top+1;

S.elem[S.top]=x;

}

else

printf("Overflow!

\n");

}

ElemTypePop(structSqStack*p)

{

ElemTypex;

if(S.top!

=0)

{

x=S.elem[S.top];

S.top=S.top-1;

return(x);

}

else

{

printf("Underflow!

\n");

return(0);

}

}

ElemTypeGetTop(structSqStack*p)

{

ElemTypex;

if(S.top!

=0)

{

x=S.elem[S.top];

return(x);

}

else

{

printf("Underflow!

\n");

return(0);

}

}

voidOutStack(structSqStack*p)

{

inti,j;

if(S.top==0)

printf("\n现在已经为你初始化好了一个顺序栈,你可以进行进栈操作了\n");

for(i=S.top;i>0;i--)

printf("第%2d个入栈的元素%6d\n",i,S.elem[i]);}

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

当前位置:首页 > 医药卫生 > 预防医学

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

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