《数据结构(C++版)》之第三章栈和队列

来源:互联网 发布:java中super的用法 编辑:程序博客网 时间:2024/06/05 14:15
《数据结构(C++版)》之第三章栈和队列
一、栈的定义
是限定仅在表尾插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈我们将其称之为空栈
插入元素也称进栈和压栈,删除元素也称出栈和弹栈。栈中的数据元素之间不仅具有线性关系,而且具有后进先出的特性。
例如:首先按顺序压栈:a1,a2,a3;如果要删除元素,其弹栈的顺序是:a3,a2,a1;
栈中的元素具有相同类型以及后进先出的特性,相邻元素之间有前驱和后继的关系。
二、栈的顺序存储结构——顺序栈
       唯一需要确定的就是用数组的哪一端作为栈底,其本质上是顺序表的简化。通常情况下,我们将数组中下标为0的一端作为栈底,同时,我们用指针top来指示栈顶元素的位置,设存储栈元素的数组长度为StackSize。

空栈时:栈顶指针top=-1;满栈时:栈顶指针top=StackSize-1;
入栈时:栈顶指针top+1;弹栈时:栈顶指针top-1;
顺序栈的实现:栈元素的数据类型不确定,所以我们一般采用C++的模版机制。其时间复杂度为O(1)。
两栈共享空间:如果需要同时使用两个相同数据类型的栈是,直接做法就是为每个栈都开辟一个存储空间,但是这样容易造成空间冗余,例如一个栈满了不够放数据了,但是另外一个栈还很空。所以,出于对这个的考虑,一般我们会采取这样可取的方法:(单向延伸性)
使用一个数组来存放这两个栈,让栈一的栈底作为数组的始端,栈二的栈底作为该数组的末端,两栈同时向数组的中间延伸。
注意:两栈共享空间以上的做法,只有空间需求具有相反关系时(即此消彼长时)安可奏效。
三、栈的链接存储结构——链栈
通常链栈用单链表表示,故链栈的结点结构和单链表的结点结构相同。用单链表的头部做栈顶。
顺序栈的实现:链栈的结点结构可以复用单链表的结点结构。其时间复杂度为O(1).链栈没有头结点,所以要将栈顶指针设为空。
四、队列的定义
队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入(入队、进队)的一端称为队尾,允许删除(出队)的另一端称为队头
队列中的元素之间不仅具有线性关系,而且具有先进先出的特性。
例如:按顺序入队:a1,a2,a3;;如果要删除元素,其出队的顺序是:a1,a2,a3;
队列中的元素具有相同类型及先进先出特性,相邻元素具有前驱和后继的关系。
五、队列的顺序存储结构——循环队列
队列是特殊的线性表。 允许队列直接从数组中下标最大的位置延续到下标最小的位置,这个通过取模操比较容易实现,这种头尾相接的顺序存储结构称为循环队列。
队空和队满的判定方法:可以用一个数组的元素空间来实现队尾指针和队头指针相差1(类似于队满的临界状态),即队满的条件为:
(rear+1)%QueueSize=front
循环队列的实现:同样的因为队列元素的数据类型不是很确定,这个时候我们还是要采用C++模版机制。其时间复杂度为O(1)。
六、循环队列的链接存储——链队列
为了使空队列和非空队列的操作一致,链队列也加上头结点。设置头指针指向链队列的头结点,队尾指针指向终端结点。
链队列的实现;同样的因为队列元素的数据类型不是很确定,这个时候我们还是要采用C++模版机制。其时间复杂度为O(1)。
七、本章知识思维导图














0 0
原创粉丝点击