数据结构(C语言版)严蔚敏清华大学出版社第三章栈和队列.ppt
《数据结构(C语言版)严蔚敏清华大学出版社第三章栈和队列.ppt》由会员分享,可在线阅读,更多相关《数据结构(C语言版)严蔚敏清华大学出版社第三章栈和队列.ppt(207页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、线性结构特点线性结构特点概念:线性表,记录,文件,表概念:线性表,记录,文件,表长,空表,位序长,空表,位序线性表的顺序存储和链式存储线性表的顺序存储和链式存储12/7/20221从从数数据据类类型型角角度度看看,它它们们是是和和线线性性表表大大不不相相同的抽象数据类型。同的抽象数据类型。从从数据结构角度数据结构角度看,栈和队列是两种特殊看,栈和队列是两种特殊的线性表,它们是操作受限的线性表,故的线性表,它们是操作受限的线性表,故也称为限定性的数据结构。也称为限定性的数据结构。4 4 第三章栈与队列内容介绍第三章栈与队列内容介绍12/7/20222 栈和队列的定义和特点栈和队列的定义和特点 熟
2、熟练练掌掌握握栈栈类类型型的的实实现现方方法法,特特别别应应注注意意栈栈满满和和栈栈空空的的条条件件以以及及它它们们的的描描述述方方法法。熟熟练练掌掌握握循循环环队队列列和和链链队队列列的的基基本本操操作作实实现现算算法法,特特别别注注意意队满和队空的描述方法队满和队空的描述方法。能在相应的应用问题中正确选用它们。能在相应的应用问题中正确选用它们。l 栈栈l栈的应用举例栈的应用举例l栈和递归的实现栈和递归的实现l队列队列12/7/20223第十讲第十讲数据结构栈及其实现主讲:刘立嘉主讲:刘立嘉12/7/20224举例举例1:家里吃饭的碗,通常在洗干净后一个一个:家里吃饭的碗,通常在洗干净后一个
3、一个地落在一起存放,在使用时,若一个一个地拿,一地落在一起存放,在使用时,若一个一个地拿,一定最先拿走最上面的那只碗,而最后拿出最下面的定最先拿走最上面的那只碗,而最后拿出最下面的那只碗。那只碗。举例举例2:在建筑工地上,使用的砖块从底往上一层:在建筑工地上,使用的砖块从底往上一层一层地码放,在使用时,将从最上面一层一层地拿一层地码放,在使用时,将从最上面一层一层地拿取。取。1 1 生活中的栈生活中的栈12/7/20225a1a2.an进栈进栈出栈出栈栈顶栈顶栈底栈底用用铁路调度站表示栈铁路调度站表示栈12/7/202261.定义定义 限定只能在表的限定只能在表的一端一端进行插入和删除操作进行
4、插入和删除操作的线性表。特点:后进先出。的线性表。特点:后进先出。2.2.逻辑结构逻辑结构 与线性表相同,仍为一对一关系与线性表相同,仍为一对一关系。3.3.存储结构存储结构 用用顺序栈顺序栈或或链栈链栈存储均可,但以顺序存储均可,但以顺序栈更常见栈更常见4.4.运算规则运算规则 只能在只能在栈顶栈顶运算,且访问结点依照运算,且访问结点依照后后进先出进先出(LIFOLIFO)或或先进后出先进后出(FILOFILO)的原则。的原则。5.5.实现方式实现方式 关键是编写关键是编写入栈入栈和和出栈出栈函数,具体实函数,具体实现依顺序栈或链栈的存储结构有别而不同。现依顺序栈或链栈的存储结构有别而不同。
5、基本操作有基本操作有:建栈、判断栈满或栈空、入栈、出栈、建栈、判断栈满或栈空、入栈、出栈、读栈顶元素值等等。读栈顶元素值等等。2 2 栈的基本概念栈的基本概念12/7/202276、栈、栈“上溢上溢”在栈满时还进行入栈运算,必定会产生空间的溢出在栈满时还进行入栈运算,必定会产生空间的溢出7 7、栈、栈“下溢下溢”当栈空时仍进行出栈运算,必定会产生空间的溢出。当栈空时仍进行出栈运算,必定会产生空间的溢出。上溢是一种出错状态,应该设法避免之;下溢则可上溢是一种出错状态,应该设法避免之;下溢则可能是正常现象,因为栈在程序中使用时,其初态或能是正常现象,因为栈在程序中使用时,其初态或终态都是空栈,所以
6、下溢常常用来作为程序控制转终态都是空栈,所以下溢常常用来作为程序控制转移的条件。移的条件。12/7/20228栈栈栈栈是仅在是仅在表尾表尾进行插入、删除操作的线性表。进行插入、删除操作的线性表。表尾表尾(即即an端端)称为称为栈顶栈顶/top;表头表头(即即a1端端)称为称为栈底栈底/base例如:例如:栈栈S S=(a,a2,a3,.,an-1,an)插入元素到栈顶的插入元素到栈顶的操作,称为操作,称为入栈入栈。从栈顶删除最后一从栈顶删除最后一个元素的操作,称个元素的操作,称为为出栈出栈。a an n称为栈顶元素称为栈顶元素a a1 1称为栈底元素称为栈底元素强调:强调:强调:强调:插入和删
7、除都只能在表插入和删除都只能在表的一端(栈顶)进行!的一端(栈顶)进行!注:堆栈可以完成比较复杂的数据元素特定序列的转换任务,但它不能完成任何输入输出序列的转换任务。12/7/20229例例1 1:堆栈是什么?它与一般线性表有什么不同?:堆栈是什么?它与一般线性表有什么不同?堆栈是一种特殊的线性表,它只能在表的堆栈是一种特殊的线性表,它只能在表的一端(即一端(即栈顶)栈顶)进行插入和删除运算。进行插入和删除运算。与一般线性表的区别:仅在于与一般线性表的区别:仅在于运算规则运算规则运算规则运算规则不同。不同。一般线性表一般线性表一般线性表一般线性表堆栈堆栈堆栈堆栈逻辑结构:逻辑结构:1:1逻辑结
8、构:逻辑结构:1:1存储结构:顺序存储结构:顺序表表、链、链表表存储结构:顺序存储结构:顺序栈栈、链、链栈栈运算规则:运算规则:随机存取随机存取随机存取随机存取运算规则:运算规则:后后后后进进进进先先先先出出出出(LIFO)“进进”插入插入=压入压入“出出”删除删除=弹弹出出12/7/202210例例2 2、一个栈的输入序列为一个栈的输入序列为1,2,3,若在,若在入栈的过程中允入栈的过程中允许出栈许出栈,则可能得到的出栈序列是什么?,则可能得到的出栈序列是什么?解:可以通过穷举所有可能性来求解:可以通过穷举所有可能性来求解:1 1入入1 1出,出,2 2入入2 2出,出,3 3入入3 3出,
9、出,即即123;1 1入入1 1出,出,2 2、3 3入,入,3 3、2 2出,出,即即132;1 1、2 2入,入,2 2出,出,3 3入入3 3出,出,即即231;1 1、2 2入,入,2 2、1 1出,出,3 3入入3 3出,出,即即213;1 1、2 2、3 3入,入,3 3、2 2、1 1出,出,即即321;合计有合计有5 5种可能性。种可能性。12/7/202211例例3 3、一个栈的输入序列是一个栈的输入序列是12345,若在,若在入栈的过入栈的过程中允许出栈程中允许出栈,则栈的输出序列则栈的输出序列43512可能实现可能实现吗?吗?12345的输出呢?的输出呢?解:解:4351
10、243512不可能实现,主要是其中的不可能实现,主要是其中的1212顺序不顺序不能实现;能实现;1234512345的输出可以实现,每压入一数便立即的输出可以实现,每压入一数便立即弹出即可。弹出即可。12/7/202212ADTStack数据对象:数据对象:Dai|aiElemSet,i=1,2,.,n,n0数据关系:数据关系:R1|ai-1,aiD,i=2,.,n约定约定an端为端为栈顶栈顶,a1端为端为栈底栈底。3 3 栈的抽象数据类型定义栈的抽象数据类型定义12/7/202213InitStack(&S)DestroyStack(&S)ClearStack(&S)StackEmpty(s
11、)StackLength(S)GetTop(S,&e)Push(&S,e)Pop(&S,&e)StackTravers(S,visit()ADTStack基本操作:基本操作:12/7/202214InitStack(&S)操作结果:构造一个空栈操作结果:构造一个空栈S。DestroyStack(&S)初始条件:栈初始条件:栈S已存在。已存在。操作结果操作结果:栈栈S被销毁。被销毁。12/7/202215StackEmpty(S)初始条件:栈初始条件:栈S已存在。已存在。操作结果:若栈操作结果:若栈S为空栈,则返回为空栈,则返回TRUE,否否则则FALE。StackLength(S)初始条件:栈
12、初始条件:栈S已存在。已存在。操作结果:返回操作结果:返回S的元素个数,即栈的长度。的元素个数,即栈的长度。12/7/202216GetTop(S,&e)初始条件:栈初始条件:栈S已存在且非空。已存在且非空。操作结果:用操作结果:用e返回返回S的栈顶元素。的栈顶元素。a1a2anClearStack(&S)初始条件:栈初始条件:栈S已存在。已存在。操作结果:将操作结果:将S清为空栈。清为空栈。12/7/202217Push(&S,e)初始条件:栈初始条件:栈S已存在。已存在。操作结果:插入元素操作结果:插入元素e为新的栈顶元素。为新的栈顶元素。a1a2ane12/7/202218Pop(&S,
13、&e)初始条件:栈初始条件:栈S已存在且非空。已存在且非空。操作结果:删除操作结果:删除S的栈顶元素,并用的栈顶元素,并用e返回其值。返回其值。a1a2anan-112/7/202219栈有两种存储表示方法:顺序栈、链栈。栈有两种存储表示方法:顺序栈、链栈。顺顺序序栈栈:即即栈栈的的顺顺序序存存储储结结构构是是利利用用一一组组地地址址连连续续的的存存储储单单元元依依次次存存放放自自栈栈底底到到栈栈顶顶的的数数据据元元素素,同同时时附附设设指指针针top指指示示栈栈顶顶元元素素在在顺顺序序栈栈中中的存储位置。的存储位置。习习惯惯做做法法是是以以top0表表示示空空栈栈,由由于于c语语言言中中数数
14、组组的的下下标标约约定定从从0开开始始,则则当当以以c作作描描述述语语言言时时,如如此此设设定定会会带带来来很很大大不不便便,另另一一方方面面,由由于于栈栈在在使使用用过过程程中中所所需需最最大大空空间间的的大大小小很很难难估估计计,因因此此,在在初初始始化化设设空空栈栈时时不不应应限限定定栈栈的的最最大大容容量。量。4 4 栈的顺序表示和实现栈的顺序表示和实现12/7/202220顺序(堆)栈顺序(堆)栈顺序存储结构的堆栈。顺序存储结构的堆栈。顺序栈的存储结构顺序栈的存储结构它是利用一组地址连续的存储它是利用一组地址连续的存储单元依次存放自栈底到栈顶的数单元依次存放自栈底到栈顶的数据元素,同
15、时设指针据元素,同时设指针top指示栈顶指示栈顶元素的当前位置。用元素的当前位置。用C语言定义:语言定义:typedefstructDataTypestackMaxStackSize;inttop;SeqStack;a0 a1 an-1顺序栈顺序栈Saian栈底栈底basebase栈顶栈顶top12/7/202221 a0 a1 an-1顺序栈顺序栈Sai问:顺序表和顺序栈的操作有何区别?问:顺序表和顺序栈的操作有何区别?表头表头表尾表尾低地址低地址高地址高地址写入:写入:Si=ai读出:读出:e=Si压入压入(PUSH)PUSH):SStop+top+=a=an n弹出弹出(POP)POP)
16、:e=Se=S-top-top 低地址低地址高地址高地址Si a0 a1ai an-1 顺序表顺序表S an以线性表以线性表S=(a0,a1,.,an-2,an-1)为为例例栈底栈底basebase栈顶栈顶toptop前提:一定要前提:一定要预设预设预设预设栈顶指针栈顶指针toptoptoptop栈顶栈顶toptop12/7/202222 top空栈toptoptoptoptopa 进栈b 进栈aababcdee 进栈abcdef 进栈溢出abdee 退栈c12/7/202223topc 退栈b 退栈abaa 退栈空空栈topabdd 退栈ctopabctoptop12/7/202224栈不存
17、在的条件:栈不存在的条件:base=NULL;栈为空栈为空的条件的条件:base=top;栈满的条件栈满的条件:top-base=MaxSize;a0 a1 an-1顺序栈顺序栈Sai低地址低地址高地址高地址an栈底栈底basebase栈顶栈顶toptop入栈入栈口诀:堆栈指针口诀:堆栈指针top“先先压后加压后加”:SStop+=a=an n出栈出栈口诀:堆栈指针口诀:堆栈指针top“先先减后弹减后弹”:e=Se=S-top 12/7/202225顺序栈的操作实现顺序栈的操作实现(1)初始化栈void StackInitiate(SeqStack*S)/*初始化顺序堆栈S*/S-top=0;
18、/*定义初始栈顶下标值*/12/7/202226(2)(2)判栈非空否判栈非空否 int StackNotEmpty(SeqStack S)/*判顺序堆栈S非空否,非空则返回1,否则返回0*/if(S.top top=MaxStackSize)printf(堆栈已满无法插入!n);return 0;else S-stackS-top=x;S-top+;return 1;12/7/202228(4)(4)出栈出栈int StackPop(SeqStack*S,DataType*d)/*弹出顺序堆栈S的栈顶数据元素值到参数d,出栈成功则返回1,否则返回0*/if(S-top top-;*d=S-s
19、tackS-top;return 1;12/7/202229(5)(5)取栈顶数据元素取栈顶数据元素int StackTop(SeqStack S,DataType*d)/*取顺序堆栈S的当前栈顶数据元素值到参数d,成功则返回1,否则返回0*/if(S.top stackS-top=x;S-top+;toptoptoptop低低地址地址L高地址高地址MBCD12/7/202231例:从栈中取出例:从栈中取出B B B BD DC CB BAtoptopD DC CABD DCB B B BAtopDCB B B BAtop低低地址地址L高地址高地址MD顺序栈出栈函数的核心语句:顺序栈出栈函数的
20、核心语句:S-top-;*d=S-stackS-top;注:DataType*d;SeqStack*S;12/7/202232两个堆栈共享空间b0t0t1b10maxSize-1V12/7/202233变化:考虑栈大小通常无法确定的情况下(1)首先确定一个基本容量STACK_INIT_SIZE,(2)一旦超过,每次再增加一定容量STACKINCREMENT。改进的顺序栈结构改进的顺序栈结构#define STACK_INIT_SIZE 100#define STACKINCREMENT 10Typedef structdatatype*base,*top;int stacksize;SqSta
21、ck;12/7/202234第十一讲第十一讲数据结构栈的链式实现及栈的应用(1)主讲:刘立嘉主讲:刘立嘉12/7/2022351、链栈的存储结构链栈的存储结构以头结点为栈顶,以头结点为栈顶,在在头结点头结点处处插入或删除插入或删除.栈也可以用链式结构来表示,用链式结构来表示的栈就是栈也可以用链式结构来表示,用链式结构来表示的栈就是链栈链栈链栈中每个结点由两个域构成:链栈中每个结点由两个域构成:datadata域和域和nextnext域,其定义为:域,其定义为:typedefstructsnodeDataTypedata;structsnode*next;LSNode;栈底栈底h h a0 a1
22、an头结点nextdata栈顶栈顶1 1、栈的链式表示和实现栈的链式表示和实现12/7/2022362 2、链式堆栈的操作实现、链式堆栈的操作实现(1)入栈int StackPush(LSNode*head,DataType x)LSNode*p;if(p=(LSNode*)malloc(sizeof(LSNode)=NULL)printf(内存空间不足无法插入!n);return 0;p-data=x;p-next=head-next;/*新结点链入栈顶*/head-next=p;/*新结点成为新的栈顶*/return 1;12/7/202237(2)(2)出栈出栈int StackPop(
23、LSNode*head,DataType*d)LSNode*p=head-next;if(p=NULL)printf(堆栈已空出错!);return 0;head-next=p-next;/*删除原栈顶结点*/*d=p-data;/*原栈顶结点元素赋予d*/free(p);/*释放原栈顶结点内存空间*/return 1;注:由此可以看出:一个链栈由其由此可以看出:一个链栈由其栈顶指针唯一指定栈顶指针唯一指定 设设headhead指向栈顶元素,则指向栈顶元素,则head=NULL head=NULL 表示栈空表示栈空12/7/2022381)1)在链栈中的头结点对操作的实现影响不大,栈顶(表头)
24、在链栈中的头结点对操作的实现影响不大,栈顶(表头)操作频繁,操作频繁,可不设头结点可不设头结点链栈。链栈。2)2)一般一般不会出现栈满不会出现栈满情况;除非没有空间导致情况;除非没有空间导致mallocmalloc分配分配失败。失败。3)3)链栈的入栈、出栈操作就是栈顶的插入与删除操作,链栈的入栈、出栈操作就是栈顶的插入与删除操作,修修改指针即可完成改指针即可完成。4)4)采用链栈存储方式的优点是,可使采用链栈存储方式的优点是,可使多个栈共享空间多个栈共享空间;当;当栈中元素个数变化较大,且存在多个栈的情况下,链栈栈中元素个数变化较大,且存在多个栈的情况下,链栈是栈的首选存储方式。是栈的首选存
25、储方式。几点说明几点说明:12/7/202239 由于栈结构具有的后进先出的固有特性,致由于栈结构具有的后进先出的固有特性,致使栈成为程序设计中常用的工具。以下是几个使栈成为程序设计中常用的工具。以下是几个栈应用的例子。栈应用的例子。十进制十进制N N和其它进制数的转换是计算机实现计和其它进制数的转换是计算机实现计算的基本问题算的基本问题,其解决方法很多其解决方法很多,其中一个简单其中一个简单算法基于下列原理算法基于下列原理:N=(N div d)*d+N mod dN=(N div d)*d+N mod d(其中其中:div:div为整除运算为整除运算,mod,mod为求余运算)为求余运算)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言版 严蔚敏 清华大学出版社 第三 队列
限制150内