数据结构:队列(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语言实现的队列,能够帮助我们解决许多实际问题,如进程调度、广度优先搜索、消息队列、缓冲区管理等。理解队列的实现和应用场景,对于编写高效的程序和解决各种实际问题至关重要。

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

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

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

相关文章

大模型Deepseek的使用_基于阿里云百炼和Chatbox

目录 前言1. 云服务商2. ChatBox参考 前言 上篇博文中探索了&#xff08;本地&#xff09;部署大语言模型&#xff0c;适合微调、数据高隐私性等场景。随着Deepseek-R1的发布&#xff0c;大语言模型的可及性得到极大提升&#xff0c;应用场景不断增加&#xff0c;对高可用的方…

zookeeper watch

目录 回顾回调&观察者模式&发布订阅模式Zookeeper 客户端/ 服务端 watchgetChildren 为例最后归纳 回顾回调&观察者模式&发布订阅模式 回调的思想 类A的a()方法调用类B的b()方法类B的b()方法执行完毕主动调用类A的callback()方法 回调分为同步回调和异步回调…

PAT乙组(1016 部分A+B 1017 A除以B)C语言超详细

文章目录 1016 部分AB1017 A除以B 1016 部分AB 输入样例 1&#xff1a; 3862767 6 13530293 3输出样例 1&#xff1a; 399输入样例 2&#xff1a; 3862767 1 13530293 8输出样例 2&#xff1a; 0代码长度限制 16 KB 时间限制 150 ms 内存限制 64 MB 栈限制 8192 KB 思路解析…

论文笔记:Multi-Head Mixture-of-Experts

2024 neurips 1 背景 稀疏混合专家&#xff08;SMoE&#xff09;可在不显著增加训练和推理成本的前提下提升模型的能力【比如Mixtral 8*7B&#xff0c;表现可以媲美LLaMA-2 70B】 但它也有两个问题 专家激活率低&#xff08;下图左&#xff09; 在优化时只有一小部分专家会被…

【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (10) – UC 使用 前言 由于ADB 的更新速度很快&#xff0c;在几个月之后重新搭建ADB 时发现UC 已经更新了很多&#xff0c;为了后续做ADB 的功…

解锁养生秘籍,拥抱健康生活

在这个快节奏的时代&#xff0c;人们行色匆匆&#xff0c;常常在忙碌中忽略了健康。其实&#xff0c;养生并非遥不可及&#xff0c;它就藏在生活的细微之处&#xff0c;等待我们去发现和实践。 规律作息是健康的基础。日出而作&#xff0c;日落而息&#xff0c;顺应自然规律&am…

动手学Agent——Day2

文章目录 一、用 Llama-index 创建 Agent1. 测试模型2. 自定义一个接口类3. 使用 ReActAgent & FunctionTool 构建 Agent 二、数据库对话 Agent1. SQLite 数据库1.1 创建数据库 & 连接1.2 创建、插入、查询、更新、删除数据1.3 关闭连接建立数据库 2. ollama3. 配置对话…

最新国内 ChatGPT Plus/Pro 获取教程

最后更新版本&#xff1a;20250202 教程介绍&#xff1a; 本文将详细介绍如何快速获取一张虚拟信用卡&#xff0c;并通过该卡来获取ChatGPT Plus和ChatGPT Pro。 # 教程全程约15分钟开通ChatGPT Plus会员帐号前准备工作 一个尚未升级的ChatGPT帐号&#xff01;一张虚拟信用卡…

Redis哈希槽机制的实现

Redis哈希槽机制的实现 Redis集群使用哈希槽&#xff08;Hash Slot&#xff09;来管理数据分布&#xff0c;整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时&#xff0c;Redis会先对键进行哈希运算&#xff0c;得到一个哈希值。然后&#xff0c;Redis将该哈…

下载安装运行测试开源vision-language-action(VLA)模型OpenVLA

1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码&#xff0c;执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…

外贸跨境订货系统流程设计、功能列表及源码输出

在全球化的商业环境下&#xff0c;外贸跨境订货系统对于企业拓展国际市场、提升运营效率至关重要。该系统旨在为外贸企业提供一个便捷、高效、安全的订货平台&#xff0c;实现商品展示、订单管理、物流跟踪等功能&#xff0c;满足跨境业务的多样化需求。以下将详细阐述外贸订货…

排序算法复习——包括插入排序、希尔排序、冒泡排序、快排(包括霍尔法、挖坑法、快慢指针法)、堆排、选择排序、归并排序等 (代码采用c/c++混编)

1.插入排序 插入排序就像我们打斗地主的时候&#xff0c;有一大把牌我们来不及理&#xff0c;就会一张一张的拿然后把拿到的牌放到合适的位置。 对于插入排序我们可以将待排序的数组理解为那一堆没有整理的牌&#xff0c;将排序好的部分理解为手上的牌&#xff0c;对于第i张牌我…

RocketMQ 5.0安装部署

0.前言 在微服务架构逐渐成为主流的今天&#xff0c;消息队列如同数字世界的快递员&#xff0c;承担着系统间高效通信的重要使命。 Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余…

Jetson Agx Orin平台preferred_stride调试记录--1924x720图像异常

1.问题描述 硬件: AGX Orin 在Jetpack 5.0.1和Jetpack 5.0.2上测试验证 图像分辨率在1920x720和1024x1920下图像采集正常 但是当采集图像分辨率为1924x720视频时,图像输出异常 像素格式:yuv_uyvy16 gstreamer命令如下 gst-launch-1.0 v4l2src device=/dev/video0 ! …

【玩转全栈】----Django模板语法、请求与响应

目录 一、引言 二、模板语法 三、传参 1、视图函数到模板文件 2、模板文件到视图函数 四、引入静态文件 五、请求与响应 ?1、请求 2、响应 六、综合小案例 1、源码展示 2、注意事项以及部分解释 3、展示 一、引言 像之前那个页面&#xff0c;太过简陋&#xff0c;而且一个完整…

#渗透测试#批量漏洞挖掘#CyberPanel面板远程命令执行漏洞(CVE-2024-51567)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞特征与影响 二、修复方案与技术细…

C++多态

目录 多态的概念多态的定义及实现协变析构函数的重写通过一段代码理解多态C11 final 和 override重载、覆盖(重写)、隐藏(重定义)的对比多态调用原理单继承中的虚函数表抽象类多继承中的虚函数表 多态的概念 概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体…

PosgreSQL比MySQL更优秀吗?

一日&#xff0c;一群开发者对PosgreSQL是不是比MySQL更优秀进行了激烈的辩论&#xff0c;双方吵的都要打起来了 正方有以下理由&#xff1a; PostgreSQL严格遵循SQL标准规范&#xff0c;相较MySQL在语法兼容性和功能完整性方面展现出更强的体系化设计&#xff0c;尤其在事务处…

『大模型笔记』Jason Wei: 大语言模型的扩展范式!

Jason Wei: 大语言模型的扩展范式! 文章目录 一. What is scaling and why do it?1. 什么是Scaling?2. 为什么要Scaling?二. Paradigm 1: Scaling next-word prediction1. 下一个词预测2. 极限多任务学习3. Why does scaling work?三. The challenge with next-word predi…

TCP协议(Transmission Control Protocol)

TCP协议&#xff0c;即传输控制协议&#xff0c;其最大的特征就是对传输的数据进行可靠、高效的控制&#xff0c;其段格式如下&#xff1a; 源端口和目的端口号表示数据从哪个进程来&#xff0c;到哪个进程去&#xff0c;四位报头长度表示的是TCP头部有多少个4字节&#xff0c;…