详解数据结构-队列

队列简介

队列(Queue)是先进先出的线性表。队列只允许在一端进行插入操作,在另一端进行删除操作,两个操作也就是入队出队。在实际应用中通常使用链表或者数组来实现,用数组实现的队列被称为顺序队列,用链表实现的队列被称为链式队列。

队列分类

单队列

单队列就是常见的队列,每次添加元素时都是添加到队尾,单队列有分为顺序队列和链式队列。
顺序队列存在“假溢出”的问题,也就是明明有空位却不能添加元素的情况,顺序队列入队和出队操作都是在其指针后面进行结点的链接和删除,这就造成其空间不断向出队的方向进行偏移,产生“假溢出”
首先用q[n]表示一个顺序存储队列,其中n为队列中元素个数,队列中元素在向量中的下标从0到n-1;
设头指针为front,尾指针为rear,约定front指向队头元素的前一位置,rear指向队尾元素,当front等于-1时队空,rear等于n-1时堆满,由于队列的性质,当队尾指针等于n-1时,若front不等于-1,则队列中仍有空闲单元,所以队列不是真满,此时若有入队操作,会造成“假溢出”
image

循环队列

循环队列就是将顺序队列的首位相连,形成逻辑上的环状空间。循环队列可以解决顺序队列的“假溢出”问题;
当front == rear 时 队空
正常情况下,当队列满时,front和rear应该指向同一个坐标,当时这样就会和队空判断一样,所以为了方便判别,假设还剩一个单元空位时,队列就满了,不再允许入队操作,此时rear在front的前一位,可以使用取模计算
当 front == (rear+1)% maxsize 时队满
示图中:from = 0,rear=5 , (5+1)% 6 == 0,队满
image

双端队列

双端队列是一种在队列两端可以进行插入和删除操作的队列,相对单向队列更灵活,同时它具有栈的特性;

优先队列

优先队列底层结构并非线性的数据结构,一般是由堆来实现,在每个元素入队时,优先队列会将新元素其插入堆中并调整堆,在队头出队时,优先队列会返回堆顶元素并调整堆。不论进行什么操作,优先队列都能按照某种排序方式进行一系列堆的相关操作,从而保证整个集合的有序性。虽然优先队列的底层并非严格的线性结构,但是在使用的过程中是感知不到堆的,从使用者的眼中优先队列可以被认为是一种线性的数据结构:一种会自动排序的线性队列

posted on 2024-06-27 10:32  luyifo  阅读(24)  评论(0)    收藏  举报

导航