栈Stack:只允许在一端进行插入或者删除操作的线性表
队列Queue: 只允许在一端进行插入,在另一端删除的线性表
队列特性Queue:
- 队列可以定义为有序列表,它允许在一端(称为 REAR)执行插入操作,并在另一端(称为 FRONT)执行删除操作。
- 队列称为“先进先出”列表。
- 例如,排队等候火车票的人会排队等候。
队列是类似于现实世界中队列的数据结构。队列是一种数据结构,其中先到先出的数据结构将首先输出,并且它遵循 FIFO(先进先出)(First In First Out)策略。队列也可以定义为列表或集合,其中插入是从称为队列后端或尾部的一端完成的,而删除是从另一端(称为队列的前端或头部)完成的。
队列基本操作:
InitQueue(&Q) //初始化队列
DestroyQueue(&Q)// 销毁队列
EnQueue(&Q,x) //入队,若队列Q未满,将x加入,使之成为新的队尾
DeQueue(&Q,&x) //出队,若队列Q非空,删除队头元素,并用x返回
GetHead(Q,&x) 读队头元素
队列类型
简单队列或线性队列
循环队列
优先级队列
双端队列( Deque)
线性队列
线性队列严格遵循先进先出规则。
使用线性队列的主要缺点是插入仅从后端完成。如果从队列中删除前三个元素,则即使线性队列中有可用的空间,我们也无法插入更多元素。在这种情况下,线性队列显示溢出情况,因为后部指向队列的最后一个元素。
循环队列
在循环队列中,所有节点都表示为循环。它类似于线性队列,只是队列的最后一个元素连接到第一个元素。它也被称为环形缓冲器,因为所有末端都连接到另一端。
通过使用循环队列可以克服线性队列中发生的缺点。如果空空间在循环队列中可用,则只需递增 rear 的值即可在空白空间中添加新元素。使用循环队列的主要优点是更好的内存利用率。
优先级队列
它是一种特殊类型的队列,其中元素是根据优先级排列的。它是一种特殊类型的队列数据结构,其中每个元素都有与之关联的优先级。假设某些元素以相同的优先级出现,它们将根据FIFO原则进行排列。
优先级队列中的插入基于到达时间进行,而优先级队列中的删除则基于优先级进行。优先级队列主要用于实现CPU调度算法。
有两种类型的优先级队列讨论如下:
- 升序优先级队列 >在优先级升序队列中,可以按任意顺序插入元素,但只能先删除最小的元素。假设数组的元素 7、5 和 3 的顺序相同,因此,可以使用相同的顺序进行插入,但删除元素的顺序为 3、5、7。
- 降序优先级队列 >在降序优先级队列中,可以按任意顺序插入元素,但只能先删除最大的元素。假设一个数组的元素 7、3 和 5 的顺序相同,因此,可以使用相同的顺序进行插入,但删除元素的顺序是 7、5、3。
Deque(双端队列)
在 Deque 或双端队列中,可以从队列的两端从前面或后面进行插入和删除。这意味着我们可以从队列的前端和后端插入和删除元素。Deque可以用作回文检查器,这意味着如果我们从两端读取字符串,则字符串将是相同的。
Deque 既可以用作堆栈,也可以用作队列,因为它允许在两端执行插入和删除操作。Deque可以被视为堆栈,因为堆栈遵循LIFO(最后进先出)原则,其中插入和删除两者只能从一端执行。在deque中,可以从一端执行插入和删除,并且Deque不遵循FIFO原则。
有两种类型的deque
-
输入受限
: 在输入受限队列中,插入操作只能在一端执行,而删除操作可以从两端执行。 -
输出受限
: 在输出受限队列中,只能在一端执行删除操作,而插入操作可以从两端执行。
对队列执行的操作
- 入队:用于在队列的后端插入元素。它返回无效。
- 出队:从队列的前端执行删除。它还返回已从前端删除的元素。它返回一个整数值。
- 查看:这是返回元素的第三个操作,该元素由队列中的前指针指向,但不将其删除。
- 队列溢出(已满):它显示队列完全满时的溢出情况。
- 队列下溢(空):它显示队列为空时的条件,即队列中没有元素。