【数据结构】线性表----队列详解

1. 队列的基本概念

话不多说,直接开始!

队列是一种线性数据结构,同栈类似但又不同,遵循先进先出FIFO, First In First Out)的原则。换句话说,最先进入队列的元素会最先被移除。这样的特点使得队列非常适合用于需要按顺序处理任务的场景。
在这里插入图片描述

特点:

  • 先进先出:第一个进入队列的元素最先被处理。
  • 操作受限:元素只能从队尾插入,从队头移除。
2. 队列的实现

在这里插入图片描述

队列可以通过多种方式实现,常见的有数组和链表两种。

使用数组实现队列:
使用数组实现队列需要维护两个指针,分别指向队头和队尾,并且需要处理数组的溢出问题。所以数组不是很适合用来实现队列。

使用链表实现队列:
链表不会受到同数组一样的困扰,并且链表实现的队列没有数组的大小限制;但需要额外的指针来管理链表的节点。

4. 队列的基本操作

队列的基本操作包括入队(Enqueue)出队(Dequeue)查看队头(Peek)检查队列是否为空(IsEmpty)

入队(Enqueue):
将元素添加到队尾。

出队(Dequeue):
移除队头的元素。

查看队头(Peek):
查看队头的元素,但不移除。

检查队列是否为空(IsEmpty):
检查队列中是否有元素。

5. 队列的高级用法

循环队列:
循环队列是一种优化的队列实现,避免了数组实现中由于出队操作造成的空间浪费。

优先队列:
优先队列中的元素具有优先级,出队时优先级高的元素会被优先移除。

6.两种形式的队列实现

在这里插入图片描述

入队(Enqueue)

将元素添加到队尾。如果使用数组实现,需要检查队列是否已满。如果使用链表实现,只需将新节点添加到链表的末尾。

数组实现的入队操作:

void enqueue(Queue* q, int value) {if (isFull(q)) {printf("Queue is full!\n");return;}if (isEmpty(q)) {q->front = 0;}q->rear++;q->items[q->rear] = value;
}

链表实现的入队操作:

void enqueue(Queue* q, int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->next = NULL;if (isEmpty(q)) {q->front = newNode;} else {q->rear->next = newNode;}q->rear = newNode;
}
出队(Dequeue)

移除队头的元素。如果使用数组实现,需要检查队列是否为空,并调整队头指针。如果使用链表实现,需要移除链表的第一个节点。

数组实现的出队操作:

int dequeue(Queue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}int item = q->items[q->front];q->front++;if (q->front > q->rear) {initQueue(q);}return item;
}

链表实现的出队操作:

int dequeue(Queue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}int item = q->front->data;Node* temp = q->front;q->front = q->front->next;if (q->front == NULL) {q->rear = NULL;}free(temp);return item;
}
查看队头(Peek)

查看队头的元素,但不移除。如果队列为空,应返回特定的错误值或抛出异常。

数组实现的查看队头操作:

int peek(Queue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}return q->items[q->front];
}

链表实现的查看队头操作:

int peek(Queue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}return q->front->data;
}
检查队列是否为空(IsEmpty)

检查队列中是否有元素。这是一个常用的辅助操作,用于确保其他操作的前提条件。

数组实现的检查是否为空操作:

int isEmpty(Queue* q) {return q->front == -1;
}

链表实现的检查是否为空操作:

int isEmpty(Queue* q) {return q->front == NULL;
}

队列的高级玩法

除了基本操作外,队列还有一些高级用法,如循环队列和优先队列。

循环队列

在这里插入图片描述

循环队列是一种优化的队列实现,避免了数组实现中由于出队操作造成的空间浪费。循环队列通过将队尾连接到队头,使得数组能够循环使用。

循环队列的实现:

#define MAX 100typedef struct {int items[MAX];int front, rear;
} CircularQueue;void initQueue(CircularQueue* q) {q->front = -1;q->rear = -1;
}int isEmpty(CircularQueue* q) {return q->front == -1;
}int isFull(CircularQueue* q) {return (q->rear + 1) % MAX == q->front;
}void enqueue(CircularQueue* q, int value) {if (isFull(q)) {printf("Queue is full!\n");return;}if (isEmpty(q)) {q->front = 0;}q->rear = (q->rear + 1) % MAX;q->items[q->rear] = value;
}int dequeue(CircularQueue* q) {if (isEmpty(q)) {printf("Queue is empty!\n");return -1;}int item = q->items[q->front];if (q->front == q->rear) {initQueue(q);} else {q->front = (q->front + 1) % MAX;}return item;
}
优先队列

优先队列中的元素具有优先级,出队时优先级高的元素会被优先移除。优先队列可以使用**堆(Heap)**来实现,能够高效地进行插入和删除操作。
而堆我们将会在下一章进行讲解。

队列在实际中的应用

队列在许多实际应用中扮演重要角色,以下是几个常见的例子:

操作系统中的任务调度

操作系统使用队列管理任务的执行顺序。任务调度器将所有待处理的任务放入队列中,并按顺序调度这些任务。

打印队列

打印机使用队列管理打印任务,确保按顺序打印。

广度优先搜索(BFS)

在图的遍历中,BFS使用队列管理待访问的节点。BFS是一种图的遍历算法,它从根节点开始,先访问所有相邻节点,再按层次访问更深的节点。

使用队列时需要注意的问题

  1. 空间复杂度: 数组实现的队列在入队和出队操作后可能会导致空间浪费,使用循环队列可以解决这个问题。
  2. 时间复杂度: 队列的基本操作时间复杂度通常为O(1),但优先队列的插入和删除操作可能会更耗时,具体取决于实现方式。
  3. 内存管理: 使用链表实现队列时,需要注意内存管理,确保在出队操作后释放已移除节点的内存,避免内存泄漏。

总结

队列作为一种重要的数据结构,具有简单但实用的特性。在本文中,我们介绍了队列的基本概念、实现方法、常见操作、实际应用以及使用时需要注意的问题。通过实践代码示例,相信读者能更好地理解和掌握队列的使用。队列在编程中的应用广泛,相信掌握了它将为你的编程技能打下坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白学python(第七天)

哈哈,这个系列的文章也有一段时间没更新,主要是最近在忙c嘎嘎,不过没事接下来会优先更python啦,那么我们先进入正题吧 函数的定义及调用 函数定义 格式:def 函数名(形参列表): 语…

QTabWidget、QListWidget、QStackedWidget

The QTabWidget class provides a stack of tabbed widgets. More... The QListWidget class provides an item-based list widget. More... QStringList strlist;strlist<<"系统"<<"外观"<<"截图"<<"贴图"…

.NET MAUI开源架构_4..NET MAUI 应用支持的平台

可以针对以下平台编写 .NET Multi-platform App UI (.NET MAUI) 应用&#xff1a; 需要 Android 5.0 (API 21) 或更高版本。需要 iOS 11 或更高版本使用 Mac Catalyst 的 macOS 11 或更高版本。Windows 11 和 Windows 10 版本 1809 或更高版本&#xff0c;使用 Windows UI 库 …

Java的高级特性

类的继承 继承是从已有的类中派生出新的类&#xff0c;新的类能拥有已有类的属性和行为&#xff0c;并且可以拓展新的属性和行为 public class 子类 extends 父类{子类类体 } 优点 代码的复用 提高编码效率 易于维护 使类与类产生关联&#xff0c;是多态的前提 缺点 类缺乏独…

c/c++ 打印调用栈

打印调用栈可以在程序出现死机的时候&#xff08;如出现 SIGABRT、SIGSEGV等一些信号错误&#xff09;是很有用的信息&#xff0c;有可能就不需要 core file 来协助排查问题了。通过 man backtrace 可以得到一个例子的源码&#xff1a; #define SIZE 100 static void backTrac…

【机器学习-00】机器学习是什么?

在科技飞速发展的今天&#xff0c;机器学习已成为一个热门话题&#xff0c;广泛应用于各个行业和领域。那么&#xff0c;机器学习到底是什么&#xff1f;它又是如何工作的&#xff1f;本文将深入探讨机器学习的定义、原理及其在各领域的应用&#xff0c;带领读者走进这个神秘而…

RedisTemplate 中序列化方式辨析

在Spring Data Redis中&#xff0c;RedisTemplate 是操作Redis的核心类&#xff0c;它提供了丰富的API来与Redis进行交互。由于Redis是一个键值存储系统&#xff0c;它存储的是字节序列&#xff0c;因此在使用RedisTemplate时&#xff0c;需要指定键&#xff08;Key&#xff09…

力扣题解( 等差数列划分 II - 子序列)

446. 等差数列划分 II - 子序列 给你一个整数数组 nums &#xff0c;返回 nums 中所有 等差子序列 的数目。 如果一个序列中 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该序列为等差序列。 例如&#xff0c;[1, 3, 5, 7, 9]、[7, 7, 7, 7] 和…

Netgear WN604 downloadFile.php 信息泄露漏洞复现(CVE-2024-6646)

0x01 产品简介 NETGEAR WN604是一款由NETGEAR(网件)公司生产的无线接入器(或无线路由器)提供Wi-Fi保护协议(WPA2-PSK, WPA-PSK),以及有线等效加密(WEP)64位、128位和152位支持,保障网络安全。同时支持MAC地址认证、802.1x RADIUS以及EAP TLS、TTLS、PEAP等安全机制,…

Flat Ads:金融APP海外广告投放素材的优化指南

在当今全球化的数字营销环境中,金融APP的海外营销推广已成为众多金融机构与开发者最为关注的环节之一。面对不同地域、文化及用户习惯的挑战,如何优化广告素材,以吸引目标受众的注意并促成有效转化,成为了广告主们亟待解决的问题。 作为领先的全球化营销推广平台,Flat Ads凭借…

超简易高效的 AI绘图工具—与sd-webui一致界面,6G显存最高提升75%出图速率!(附安装包)

大家好&#xff0c;我是灵魂画师向阳 今天给大家分享一个基于Stable Diffusion WebUI 构建的AI绘图工具—sd-webui-forge&#xff0c;该工具的目标在于简化插件开发&#xff0c;优化资源管理&#xff0c;加速推理。 Forge承诺永远不会对Stable Diffusion WebUI用户界面添加不…

获奖案例回顾|基于卫星遥感和无人机的水稻全流程风险减量项目

引言 在现代农业保险领域&#xff0c;技术创新是推动行业进步的关键。珈和科技与太平财险的合作&#xff0c;旨在利用先进的卫星遥感和无人机技术&#xff0c;解决传统农业保险面临的诸多挑战&#xff0c;从而提升保险效率和服务质量。本次分享的项目案例获得了《金融电子化》…

启动yarn后,其他节点没有NodeManager

写在前面&#xff1a; 这个问题虽然折磨了我两天&#xff0c;但是原因特别蠢&#xff0c;可能与各位不一定一样&#xff0c;我是因为ResourceManager的节点的"/etc/hadoop/workers"文件没有配置好&#xff08;没有配hadoop102和hadoop104&#xff09;&#xff0c;但排…

数字图像处理(实践篇)四十八 PCA主成分分析降维与图像重建

目录 一 PCA 二 实践 实践① 实践② 一 PCA 主成分分析(PCA)是一种常见的数据分析技术,它可以用于降维和特征提取。 PCA 的作用包括以下几个方面: ①数据降维:PCA 可以将高维数据降维到低维空间中,从而方便后续的数据分析和可视化。可以将具有多个变量的数据集降维…

P1850换教室 题解(概率dp)

题目&#xff1a;https://www.luogu.com.cn/problem/P1850 思路&#xff1a; 概率dp,如果要求最小路径期望&#xff0c;我们要确定的有选了几节课&#xff0c;申请换了几节课&#xff0c;最后一节是否申请换课&#xff08;下一次选课要知道上一次选课申请情况&#xff09;。 …

小白学webgl合集-三维数据源和格式

大多数地图瓦片数据是二维的&#xff0c;三维效果通过渲染和样式设置实现。主要的三维数据源和格式包括&#xff1a; 1. 3D Tiles (CesiumJS) 3D Tiles 是一种开放标准&#xff0c;用于流式传输和可视化大规模三维地理数据。它可以包含各种三维数据&#xff0c;如建筑物、点云…

循环结构(二)——while语句【互三互三】

文章目录 &#x1f341;引言 &#x1f341;一、语句格式 &#x1f341;二、语句执行过程 &#x1f341;三、格式举例 &#x1f341;四、例题 &#x1f449;【例1】 &#x1f48e;【示例代码】 &#x1f449;【例2】 &#x1f680;【方法1】&#xff1a; &#x1f48e…

运维的操作红线

1. 无工单、邮件的任何操作&#xff0c;严禁执行。 2. 工单标题和内容不一致或工单内容超出现场范围禁止操作。 3. 操作前必须确定资产信息&#xff1a;机柜号、U位、资产号、sn 号、ip。 4. 机柜后门操作设备&#xff0c;必须多次执行第 3 条红线。 5. 严禁操作、触碰工单指定…

【Java伴学笔记】Day-02 变量|计算机的存储方式|数据类型|标识符|键盘输入流

一、变量 在Java中&#xff0c;变量用于存储数据值&#xff0c;可以是数字、文本或其他类型的信息。Java中的变量必须声明后才能使用&#xff0c;并且每个变量都有特定的类型。下面是一些基本的变量使用示例&#xff1a; 声明一个整型变量并赋值&#xff1a; int myNumber; …

企业如何选择渲染农场?渲染100邀请码1a12

渲染农场能降低企业成本&#xff0c;帮助企业更好的服务客户&#xff0c;那么如何选择渲染农场呢&#xff1f;又有什么标准&#xff1f;这次我们就来看下。 1、渲染性能 渲染性能是衡量农场优劣的重要指标&#xff0c;性能越好农场越优质&#xff0c;性能主要包括渲染速度、稳…