栈只允许在一端进行插入或删除操作的线性表
栈的顺序存储称为顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。
S.top
,初始时设置S.top=-1
S.top==-1
S.top==MaxSize-1
MaxSize=S.top+1
利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
两个栈的栈顶指针都指向栈顶元素,top0=-1
时0号栈为空,top1=MaxSize
时1号栈为空;仅当两个栈指针相邻top1-top0=1
时,判断为栈满。当0号栈进栈时top0先加1再赋值,1号栈进栈时top1先减1再赋值;出栈则相反。
共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间都被占满时才会发生上溢,其取数据的时间复杂度均为O(1)。
采用链式存储的栈称为链栈,链栈的优点便是多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。规定链栈没有头结点,Lhead指向栈顶元素。
队列(Queue
):简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。
队列是操作受限的线性表,所以,不是任何对线性表的操作都可以作为队列的操作。比如,不可随便读取队列中间的某个元素。
队列的顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针front
和rear
分别指向队头和队尾的位置,设队头指针指向队头元素,队尾指针指向队尾元素的下一个位置。
Q.front==Q.rear==0
将顺序队列臆造为一个环状的空间,即把存储队列元素的表从逻辑上看成一个环,称为循环队列。
Q.front==Q.rear==0
Q.front=(Q.front+1)%MaxSize
Q.rear=(Q.rear+1)%MaxSize
为了区分队空和队满的情况,有三种处理方式:
1. 牺牲一个单元来区分队空和队满,入队时少用一个队列单元,这是一种较为普遍的做法。约定以“队头指针在队尾指针的下一个位置作为队满的标志”。
Q.front==Q.rear==0
(Q.rear+1)%MaxSize==Q.front
(Q.rear-Q.front+MaxSize)%MaxSize
2. 类型中增设表示元素个数的数据成员。
3. 类型中增设tag数据成员,以区分是队满还是队空。tag等于0的情况下,若因删除导致Q.front==Q.rear则队空;tag等于1的情况下,若因插入导致Q.front==Q.rear则队满。
队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表,头指针指向队头节点,尾指针指向队尾节点,即单链表的最后一个节点。
当Q.front==NULL
且Q.rear==NULL
时,链式队列为空
Q.front
和Q.rear
都为NULL
)。Q.rear
指向这个新插入的节点(若原队列为空队,则令Q.front
也指向该节点)双端队列是指允许在两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍然是线性结构。将队列的两端分别称为前端和后端。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。