当前位置: 首页 > article >正文

数据结构:队列(Queue)及其实现

队列(Queue)是一种广泛使用的线性数据结构,它遵循先进先出(FIFO,First In, First Out)的原则。也就是说,最早插入队列的元素会最先被移除。队列是一种典型的顺序存取结构,它与栈(Stack)不同,栈遵循的是后进先出(LIFO)的原则。

本文将介绍队列的基本概念、实现逻辑、应用场景,并通过C语言代码实现队列。

1. 队列的基本概念

队列的主要操作包括:

  • 入队(Enqueue):将一个元素添加到队列的末尾。
  • 出队(Dequeue):从队列的前端移除一个元素。
  • 队头元素(Front):获取队列的第一个元素(即最早入队的元素)。
  • 队尾元素(Rear):获取队列的最后一个元素。
  • 队列为空(IsEmpty):判断队列是否为空。
  • 队列为满(IsFull):判断队列是否为满(对于固定大小的队列)。

队列常常应用于需要顺序处理元素的场景,尤其是在资源管理和数据传输中。


2. 队列的实现逻辑

队列可以基于数组链表来实现。这里我们使用数组实现队列,并通过一个指针frontrear来指示队列的头部和尾部。

队列的基本操作

  1. 初始化:创建一个大小为MAX的数组来存储队列的元素,使用frontrear指针来标记队列的头部和尾部。
  2. 入队操作(Enqueue):将一个元素添加到队尾,并更新rear指针。
  3. 出队操作(Dequeue):从队头移除一个元素,并更新front指针。
  4. 查看队头元素:返回front指针指向的元素,但不移除它。
  5. 检查队列是否为空:如果front指针等于rear指针,则队列为空。
  6. 检查队列是否为满:如果rear指针等于MAX - 1,则队列已满。

3. C语言实现队列

#include <stdio.h>
#include <stdlib.h>#define MAX 5  // 队列的最大容量// 队列结构体
typedef struct {int arr[MAX];  // 存储队列元素的数组int front;     // 队头指针int rear;      // 队尾指针
} Queue;// 队列初始化
void initQueue(Queue* queue) {queue->front = -1;  // 队列为空时,front指针为-1queue->rear = -1;   // 队列为空时,rear指针为-1
}// 判断队列是否为空
int isEmpty(Queue* queue) {return queue->front == -1;  // 如果front指针为-1,说明队列为空
}// 判断队列是否为满
int isFull(Queue* queue) {return queue->rear == MAX - 1;  // 如果rear指针为MAX-1,说明队列已满
}// 入队操作
void enqueue(Queue* queue, int value) {if (isFull(queue)) {printf("队列已满,无法入队!\n");return;}if (queue->front == -1) {  // 如果队列为空queue->front = 0;  // 将front指针指向队头}queue->rear++;  // 将队尾指针向后移动queue->arr[queue->rear] = value;  // 将元素放入队尾printf("元素 %d 入队成功!\n", value);
}// 出队操作
int dequeue(Queue* queue) {if (isEmpty(queue)) {printf("队列为空,无法出队!\n");return -1;}int value = queue->arr[queue->front];  // 获取队头元素if (queue->front == queue->rear) {  // 如果队列只有一个元素queue->front = queue->rear = -1;  // 队列为空} else {queue->front++;  // 队头指针向后移动}return value;  // 返回出队的元素
}// 获取队头元素
int front(Queue* queue) {if (isEmpty(queue)) {printf("队列为空,无法获取队头元素!\n");return -1;}return queue->arr[queue->front];  // 返回队头元素
}// 打印队列的元素
void printQueue(Queue* queue) {if (isEmpty(queue)) {printf("队列为空,无法打印!\n");return;}printf("队列中的元素:");for (int i = queue->front; i <= queue->rear; i++) {printf("%d ", queue->arr[i]);}printf("\n");
}int main() {Queue queue;initQueue(&queue);  // 初始化队列// 入队操作enqueue(&queue, 10);enqueue(&queue, 20);enqueue(&queue, 30);enqueue(&queue, 40);enqueue(&queue, 50);// 打印队列元素printQueue(&queue);// 再入队时,队列已满enqueue(&queue, 60);// 出队操作printf("出队元素: %d\n", dequeue(&queue));printf("出队元素: %d\n", dequeue(&queue));// 打印队列元素printQueue(&queue);// 查看队头元素printf("队头元素: %d\n", front(&queue));return 0;
}

4. 代码注释说明

  • 队列结构体Queue结构体包含了一个大小为MAX的数组arr来存储队列的元素,以及两个指针:frontrear,分别表示队列的头部和尾部。

  • initQueue函数:初始化队列,设置frontrear为-1,表示队列为空。

  • isEmpty函数:检查队列是否为空,如果front为-1,表示队列为空,返回1,否则返回0

  • isFull函数:检查队列是否为满,如果rear等于MAX - 1,表示队列已满,返回1,否则返回0

  • enqueue函数:将元素添加到队列的尾部,首先检查队列是否已满。如果队列为空,设置front0,然后更新rear,并将元素添加到队列尾部。

  • dequeue函数:从队列的头部移除元素,首先检查队列是否为空。如果队列中只有一个元素,出队后将frontrear都设为-1,表示队列为空;否则,front指针向后移动。

  • front函数:返回队列的头部元素(不移除),如果队列为空,返回-1。

  • printQueue函数:遍历队列并打印所有元素。

5. 运行示例

假设我们运行上述程序,输出结果如下:

元素 10 入队成功!
元素 20 入队成功!
元素 30 入队成功!
元素 40 入队成功!
元素 50 入队成功!
队列中的元素:10 20 30 40 50 
队列已满,无法入队!
出队元素: 10
出队元素: 20
队列中的元素:30 40 50 
队头元素: 30
  • 初始时,队列为空,通过入队操作将元素10, 20, 30, 40, 50依次添加到队列中。
  • 尝试再次入队时,由于队列已满,无法入队。
  • 进行出队操作,弹出队头元素1020,并打印剩余的队列元素。
  • 最后查看队头元素30

6. 队列的应用场景

队列作为一种非常基础且重要的数据结构,广泛应用于多个领域。以下是一些典型的应用场景:

1. 进程调度

操作系统中的进程调度通常使用队列来管理就绪队列(ready queue)和等待队列(waiting queue)。操作系统中的进程会按照先进先出(FIFO)的原则排队执行。

2. 打印队列

打印任务通常会排队,多个打印任务被依次处理。在这种场景中,打印任务按照队列的方式进行排队,先打印入队的任务。

3. 广度优先搜索(BFS)

在图的遍历中,广度优先搜索(BFS)使用队列来存储待访问的节点。队列保证了节点的访问顺序是按照距离源节点的层次顺序进行的。

4. 消息队列

在多线程或分布式系统中,消息队列用于实现进程之间的通信。发送方将消息放入队列,接收方从队列中取出消息进行处理。

5. 缓冲区管理

队列用于实现缓冲区(如IO缓冲区、数据流缓冲区)。数据按照先进先出的顺序被读入或写出,常用于网络数据包的接收和发送、流媒体处理等。

7. 总结

队列是一种重要的线性数据结构,它遵循先进先出的原则,常见的操作包括入队、出队、查看队头元素等。通过C语言实现的队列,能够帮助我们解决许多实际问题,如进程调度、广度优先搜索、消息队列、缓冲区管理等。理解队列的实现和应用场景,对于编写高效的程序和解决各种实际问题至关重要。

版权声明:本文为原创文章,转载请注明出处。

相关文章:

数据结构:队列(Queue)及其实现

队列&#xff08;Queue&#xff09;是一种广泛使用的线性数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff0c;First In, First Out&#xff09;的原则。也就是说&#xff0c;最早插入队列的元素会最先被移除。队列是一种典型的顺序存取结构&#xff0c;它与栈&…...

MoE架构中的专家选择门控机制:稀疏激活如何实现百倍效率突破?

技术原理&#xff08;数学公式与核心逻辑&#xff09; 核心公式 门控网络输出&#xff1a; G ( x ) Softmax ( W g ⋅ x b g ) G(x) \text{Softmax}(W_g \cdot x b_g) G(x)Softmax(Wg​⋅xbg​) 最终输出&#xff1a; y ∑ i 1 n G i ( x ) ⋅ E i ( x ) (仅保留Top-…...

坐井说天阔---DeepSeek-R1

前言 DeepSeek-R1这么火&#xff0c;虽然网上很多介绍和解读&#xff0c;但听人家的总不如自己去看看原论文。于是花了大概一周的时间&#xff0c;下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…...

UART(一)——UART基础

一、定义 UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。 功能和特点 基本的 UART 系统只需三个信号即可提供稳健的中速全双工…...

DeepSeek 的创新融合:多行业应用实践探索

引言 在数字化转型的浪潮中&#xff0c;技术的融合与创新成为推动各行业发展的关键力量。蓝耘平台作为行业内备受瞩目的创新平台&#xff0c;以其强大的资源整合能力和灵活的架构&#xff0c;为企业提供了高效的服务支持。而 DeepSeek 凭借先进的人工智能技术&#xff0c;在自然…...

C语言中的常量与只读变量,#define与const的区别

#include中的#表明C处理器需要在编译器接手工作之前先处理这条指令。 #define 这条定义宏的语句&#xff0c;是不是很熟悉&#xff0c;这条预处理指令会在编译器编译前把源文件中使用到这个宏的地方都先展开。 #define NUM 12 这个定义了一个宏常量&#xff0c;它的处理发生编…...

Python常见面试题的详解6

1. 按字典 value 值排序 要点&#xff1a;对于给定字典&#xff0c;使用 sorted() 函数结合 items() 方法&#xff0c;依据 value 进行排序&#xff0c;也可以定义一个通用函数&#xff0c;支持按 value 升序或降序排序。示例&#xff1a; python d {a: 1, b: 2, c: 3, d: …...

CentOS 7超详细安装教程(含镜像)

1. 安装前准备 1.1 CentOS简介 CentOS&#xff08;Community Enterprise Operating System&#xff0c;中文意思是&#xff1a;社区企业操作系统&#xff09;是一种基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码构建的免费开源操作系统。它在稳定性、安全…...

代码随想录day12

144.二叉树的前序遍历 //明确递归的函数&#xff0c;结束边界&#xff0c;单层逻辑 void traversal(TreeNode* node, vector<int>& list){if(node nullptr){return;}list.push_back(node->val);traversal(node->left, list);traversal(node->right, list)…...

langchain学习笔记之消息存储在内存中的实现方法

langchain学习笔记之消息存储在内存中的实现方法 引言背景消息存储在内存的实现方法消息完整存储&#xff1a;完整代码 引言 本节将介绍 langchain \text{langchain} langchain将历史消息存储在内存中的实现方法。 背景 在与大模型交互过程中&#xff0c;经常出现消息管理方…...

布隆过滤器(简单介绍)

布隆过滤器&#xff08;Bloom Filter&#xff09; 是一种高效的概率型数据结构&#xff0c;用于快速判断一个元素是否可能存在于某个集合中。它的核心特点是空间效率极高&#xff0c;但存在一定的误判率&#xff08;可能误报存在&#xff0c;但不会漏报&#xff09;。 核心原理…...

Qt中基于开源库QRencode生成二维码(附工程源码链接)

目录 1.QRencode简介 2.编译qrencode 3.在Qt中直接使用QRencode源码 3.1.添加源码 3.2.用字符串生成二维码 3.3.用二进制数据生成二维码 3.4.界面设计 3.5.效果展示 4.注意事项 5.源码下载 1.QRencode简介 QRencode是一个开源的库&#xff0c;专门用于生成二维码&…...

SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪

SpringBoot教程&#xff08;三十二&#xff09; | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么&#xff1f;二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提&#xff1a; Agents 8.9.0 放入 …...

IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)

IntelliJ IDEA 接入 AI 编程助手&#xff08;Copilot、DeepSeek、GPT-4o Mini&#xff09; &#x1f4ca; 引言 近年来&#xff0c;AI 编程助手已成为开发者的高效工具&#xff0c;它们可以加速代码编写、优化代码结构&#xff0c;并提供智能提示。本文介绍如何在 IntelliJ I…...

【机器学习】深入浅出KNN算法:原理解析与实践案例分享

在机器学习中&#xff0c;K-最近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;是一种既直观又实用的算法。它既可以用于分类&#xff0c;也可以用于回归任务。本文将简单介绍KNN算法的基本原理、优缺点以及常见应用场景&#xff0c;并通过一个简单案例帮助大家快速入…...

vscode的一些实用操作

1. 焦点切换(比如主要用到使用快捷键在编辑区和终端区进行切换操作) 2. 跳转行号 使用ctrl g,然后输入指定的文件内容&#xff0c;即可跳转到相应位置。 使用ctrl p,然后输入指定的行号&#xff0c;回车即可跳转到相应行号位置。...

JavaEE基础 Tomcat与Http (下)

目录 1.HTTP 协议 1.1 HTTP 协议概念 1.2. 无状态协议 1.3. HTTP1.0 和 HTTP1.1 1.4 请求协议和响应协议 ​编辑 1.5 请求协议 1.5.1 常见的请求协议 1.5.2 GET 请求 1.5.3 POST请求 1.5.4 响应协议 1.HTTP 协议 Http浏览器访问东西都是遵循的Http协议。 1.1 HTTP 协议…...

【Linux】【进程】epoll内核实现总结+ET和LT模式内核实现方式

【Linux】【网络】epoll内核实现总结ET和LT模式内核实现方式 1.epoll的工作原理 eventpoll结构 当某一进程调用epoll_create方法时&#xff0c;Linux内核会创建一个eventpoll结构体&#xff0c;这个结构体中有两个成员与epoll的使用方式密切相关. struct eventpoll{..../*红…...

英码科技基于昇腾算力实现DeepSeek离线部署

DeepSeek-R1 模型以其创新架构和高效能技术迅速成为行业焦点。如果能够在边缘进行离线部署&#xff0c;不仅能发挥DeepSeek大模型的效果&#xff0c;还能确保数据处理的安全性和可控性。 英码科技作为AI算力产品和AI应用解决方案服务商&#xff0c;积极响应市场需求&#xff0…...

测试常见问题汇总-检查表(持续完善)

WEB页面常见的问题 按钮功能的实现&#xff1a;返回按钮是否可以正常返回 信息保存提交后&#xff0c;系统是否给出“成功”的提示信息&#xff0c;列表数据是否自动刷新 没有勾选任何记录直接点【删除】&#xff0c;是否给出“请先选择记录”的提示 删除是否有删除确认框 …...

【SQL】SQL约束

&#x1f384;约束 &#x1f4e2;作用:是用于限制存储再表中的数据。可以再创建表/修改表时添加约束。 &#x1f4e2;目的:保证数据库中数据的正确、有效性和完整性。 &#x1f4e2;对于一个字段可以同时添加多个约束。 &#x1f384;常用约束: 约束分类 约束 描述关键字非…...

解决 `pip is configured with locations that require TLS/SSL` 错误

问题描述 在使用 pip 安装 Python 包时&#xff0c;可能会遇到以下错误&#xff1a; WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.这意味着 Python 的 ssl 模块未正确安装或配置&#xff0c;导致 p…...

如何commit后更新.gitignore实现push

目录 步骤 1: 更新 .gitignore 文件 步骤 2: 移除已追踪的大文件 步骤 3: 提交更改 步骤 4: 尝试推送 注意事项 如果已经执行了git commit&#xff0c;但后来意识到需要更新.gitignore文件以排除某些不应该被追踪的大文件或目录&#xff0c;并希望在不丢失现有提交记录的情…...

Python 面向对象的三大特征

前言&#xff1a;本篇讲解面向对象的三大特征&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff0c;还有比较细致的&#xff08;类属性类方法&#xff0c;静态方法&#xff09;&#xff0c;分步骤讲解&#xff0c;比较适合理清楚三大特征的思路 面向对象的…...

机器学习_18 K均值聚类知识点总结

K均值聚类&#xff08;K-means Clustering&#xff09;是一种经典的无监督学习算法&#xff0c;广泛应用于数据分组、模式识别和降维等领域。它通过将数据划分为K个簇&#xff0c;使得簇内相似度高而簇间相似度低。今天&#xff0c;我们就来深入探讨K均值聚类的原理、实现和应用…...

从低清到4K的魔法:FlashVideo突破高分辨率视频生成计算瓶颈(港大港中文字节)

论文链接&#xff1a;https://arxiv.org/pdf/2502.05179 项目链接&#xff1a;https://github.com/FoundationVision/FlashVideo 亮点直击 提出了 FlashVideo&#xff0c;一种将视频生成解耦为两个目标的方法&#xff1a;提示匹配度和视觉质量。通过在两个阶段分别调整模型规模…...

Nuclei 使用手册

Nuclei 是一个开源的快速、高效的漏洞扫描工具&#xff0c;主要用于网络安全领域的漏洞检测。它由 go 语言开发&#xff0c;设计目的是为了高效地扫描 Web 应用程序、网络服务等目标&#xff0c;帮助安全研究人员、渗透测试人员以及红队成员发现潜在的漏洞。 下载链接&#xf…...

python学opencv|读取图像(六十七)使用cv2.convexHull()函数实现图像轮廓凸包标注

【1】引言 前序学习进程中&#xff0c;已经初步探索了对图像轮廓的矩形标注和圆形标注&#xff1a; python学opencv|读取图像&#xff08;六十五&#xff09;使用cv2.boundingRect()函数实现图像轮廓矩形标注-CSDN博客 但实际上&#xff0c;这两种标注方法都是大致的&#x…...

基于SpringBoot的“高校创新创业课程体系”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“高校创新创业课程体系”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 个人中心界…...

前端带样式导出excel表格,html表格生成带样式的excel表格

众所周知&#xff0c;前端生成表格通常是用xlsx、excel.js等js库&#xff0c;但这些库想要生成时增加excel样式会很麻烦。 有这么一个js库把html表格连样式带数据一并导出为excel表格: html-table-to-excel npm install html-table-to-excel 使用 html表格&#xff1a; <…...