【数据结构】什么是队列?

简介: 【数据结构】什么是队列?

人生,是一个又一个小小的队列重现.春夏秋冬轮回年年,早中晚夜循环天天.变化的是时间,不变的是你对未来执着的信念.                           ——封清扬


📌队列的定义

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.

队列是一种先进先出(First In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端称为队头.

队列在程序设计中用的非常频繁,比如用键盘在屏幕上进行各种字母或数字的输入.

我们都知道,键盘输入的内容是先存到键盘缓冲区然后再从键盘缓冲区输出到屏幕上,而键盘缓冲区存储数据的方式就是队列,假如我想告诉女朋友你是我的"god",那么用队列存储数据的话按先进先出原则,内容输出到屏幕上也应该是"god":


但是如果键盘缓冲区是使用栈来存储数据的,那就不得了了,按照先进后出的原则,我输入了"god",屏幕上却显示"dog",那估计晚上搓衣板和榴莲是少不了要跪一个了.


📌队列的抽象数据类型

同样是线性表,队列也有类似线性表的各种操作,不同之处在于插入数据只能在队尾进行,删除数据只能在队头进行.

队列抽象数据类型如下:

ADT 队列(Queue)
Data
  队列的数据对象集合为 {a1, a2, ..., an},每个元素的类型均为QDataType.
  其中, 除第一个元素a1外, 每一个元素有且只有一个直接前驱元素.
  除了最后一个元素an外, 每一个元素有且只有一个直接后继元素.
  数据元素之间的关系是一对一的关系.
Operation
  InitQueue(*Q);      初始化操作, 建立一个空的队列Q.
    DestroyQueue(*Q)        若队列Q存在,则销毁它.
  QueueEmpty(Q);      若队列Q为空,返回true,否则返回false.
  ClearQueue(*Q);     将队列Q清空.
  GetHead(Q, *e);       若队列Q存在且非空,用e返回Q的队头元素.
    EnQueue(*Q,e);          若队列Q存在,插入新元素e到队列Q中并成为队尾元素.
  DeQueue(*Q,*e);         删除队列Q中队头元素,并用e返回其值.
  QueueLength(Q);     返回队列Q的元素个数.
endADT

📌队列的顺序存储结构

顺序队列顺序表一样,都是使用数组来实现的,对于队列这种只能一头插入,另一端删除的线性表来说,使用数组必然会导致入队和出队中有一个时间复杂度是O(1),另一个是O(n).

顺序队列中,入队和出队的逻辑完全和顺序表的尾插,尾删,头插,头删逻辑一样,但区别在于,选择数组下标为0作队头,那入队就是尾插,出队就是头删.

其操作逻辑和顺序表完全相同,这里就不多赘述了.


📌队列的链式存储结构

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出,简称链队列.

为了操作方便,我们将队头指针指向链队列的首节点,将队尾指针指向尾结点:

空队列时,front和rear都指向NULL.

链队列的入队操作和单链表尾插逻辑相同,但在尾插结束后需要移动队尾指针指向新队尾.

链队列的出队操作和单链表头删逻辑相同,但在头删后同样需要移动队头指针指向新队头.


结语

当我们了解了队列的定义后,接下来我们将一起实现一个链队列程序,由于篇幅有限,我会在下篇博客中为大家详细介绍一下链队列的实现,感兴趣的话可以点击下面链接查看:

希望这篇有关数据结构队列的介绍文章能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!



数据结构栈与队列篇思维导图:


相关文章
|
5天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
64 9
|
1月前
|
缓存 算法 调度
数据结构之 - 双端队列数据结构详解: 从基础到实现
数据结构之 - 双端队列数据结构详解: 从基础到实现
57 5
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
86 64
|
8天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
27天前
初步认识栈和队列
初步认识栈和队列
57 10
|
27天前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
20 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
29天前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
28 2
【数据结构】--- 栈和队列
【数据结构】--- 栈和队列
|
1月前
|
消息中间件 存储 Java
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
数据结构之 - 深入探析队列数据结构: 助你理解其原理与应用
29 4
|
1月前
【初阶数据结构】深入解析队列:探索底层逻辑
【初阶数据结构】深入解析队列:探索底层逻辑