队列Queue原理及其C语言实现

ops/2025/2/8 4:15:45/

原理

队列是一种 先进先出(FIFO, First In First Out) 的线性数据结构,操作限制在两端:

  • 队尾(Rear):仅允许插入元素(入队,enqueue)。

  • 队头(Front):仅允许删除元素(出队,dequeue)。

队列的底层可通过 数组 或 链表 实现。数组实现需处理固定大小和循环利用(避免空间浪费),链表实现则动态扩展。

对列操作示意

1. 初始状态Front = -1, Rear = -1+---+---+---+---+---+|   |   |   |   |   |+---+---+---+---+---+2. 入队元素 AFront = 0, Rear = 0+---+---+---+---+---+| A |   |   |   |   |+---+---+---+---+---+3. 入队元素 B、CFront = 0, Rear = 2+---+---+---+---+---+| A | B | C |   |   |+---+---+---+---+---+4. 出队元素 AFront = 1, Rear = 2+---+---+---+---+---+|   | B | C |   |   |+---+---+---+---+---+5. 循环队列(数组满后复用空间)Front = 1, Rear = 0+---+---+---+---+---+| D | B | C | E | F | → Rear 回到索引 0(循环)+---+---+---+---+---+

应用场景

  1. 任务调度:操作系统按顺序处理进程请求。

  2. 消息队列:异步通信系统中缓冲消息(如 RabbitMQ)。

  3. 打印机任务:按提交顺序打印文件。

  4. 广度优先搜索(BFS):遍历树或图的节点层级。

  5. 实时系统:事件按发生顺序处理(如键盘输入缓冲)。

C语言代码实现

//1. 定义队列结构
#include <stdio.h>
#include <stdlib.h>#define MAX_SIZE 5typedef struct Queue {int data[MAX_SIZE];int front;  // 队头索引int rear;   // 队尾索引
} Queue;//2. 初始化队列
Queue* createQueue() {Queue* queue = (Queue*)malloc(sizeof(Queue));if (!queue) {printf("内存分配失败!\n");exit(1);}queue->front = -1;queue->rear = -1;return queue;
}//3. 基本操作实现
// 判空
int isEmpty(Queue* queue) {return queue->front == -1;
}// 判满
int isFull(Queue* queue) {return (queue->rear + 1) % MAX_SIZE == queue->front;
}// 入队
void enqueue(Queue* queue, int value) {if (isFull(queue)) {printf("队列已满,无法入队!\n");return;}if (isEmpty(queue)) {queue->front = 0;}queue->rear = (queue->rear + 1) % MAX_SIZE;queue->data[queue->rear] = value;
}// 出队
int dequeue(Queue* queue) {if (isEmpty(queue)) {printf("队列为空,无法出队!\n");return -1;}int value = queue->data[queue->front];if (queue->front == queue->rear) {// 队列只剩一个元素,重置指针queue->front = queue->rear = -1;} else {queue->front = (queue->front + 1) % MAX_SIZE;}return value;
}// 查看队头
int peek(Queue* queue) {if (isEmpty(queue)) {printf("队列为空!\n");return -1;}return queue->data[queue->front];
}// 打印队列
void printQueue(Queue* queue) {if (isEmpty(queue)) {printf("队列为空!\n");return;}int i = queue->front;printf("队列元素: ");do {printf("%d ", queue->data[i]);i = (i + 1) % MAX_SIZE;} while (i != (queue->rear + 1) % MAX_SIZE);printf("\n");
}/* ---------- 应用示例:模拟银行叫号系统 ---------- */
int main() {Queue* queue = createQueue();  // 创建容量为5的队列// 客户取号enqueue(queue, 101);enqueue(queue, 102);enqueue(queue, 103);printQueue(queue);  // 输出: 101 102 103// 柜员处理客户printf("正在处理: %d\n", dequeue(queue));  // 输出 101printf("下一个客户: %d\n", peek(queue));    // 输出 102// 新客户继续取号enqueue(queue, 104);enqueue(queue, 105);enqueue(queue, 106);  // 触发队列已满提示printQueue(queue);    // 输出: 102 103 104 105return 0;
}

 实现方式对比

 总结

  • 核心特性:先进先出,操作受限(仅队头出队、队尾入队)。

  • 时间复杂度:入队、出队、查看队头均为 O(1)

  • 适用场景:需按顺序处理任务的场景(如调度、缓冲、BFS)。


http://www.ppmy.cn/ops/156630.html

相关文章

深度整理总结MySQL——行记录存储

行记录存储 前言InnoDB页简介数据存放在哪个空间表空间的结构是怎么样的行(row)页(page)区(Extent)段(Segment) InnoDB行格式COMPACT行格式记录的额外信息变长字段长度列表为什么变长字段长度列表按逆序存放每个数据库表的行格式都有「变长字段字节数列表」吗? NULL值每个数据…

PHP JSON操作指南

PHP JSON操作指南 概述 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。PHP作为一门流行的服务器端脚本语言&#xff0c;支持对JSON数据进行读取、编写和解析。本文将…

(2025,LVLM,高分辨率图像处理,子图划分,全局语义引导注意力权重分配)

Global Semantic-Guided Sub-image Feature Weight Allocation in High-Resolution Large Vision-Language Models 目录 1. 引言 2. 本文贡献 3. 方法 3.1 现有高分辨率图像处理方法 3.2 全局语义引导权重分配&#xff08;GSWA&#xff09; 4. 实验结果 4.1 通用基准测试…

ollama部署deepseek实操记录

1. 安装 ollama 1.1 下载并安装 官网 https://ollama.com/ Linux安装命令 https://ollama.com/download/linux curl -fsSL https://ollama.com/install.sh | sh安装成功截图 3. 开放外网访问 1、首先停止ollama服务&#xff1a;systemctl stop ollama 2、修改ollama的servic…

flowable expression和json字符串中的双引号内容

前言 最近做项目&#xff0c;发现了一批特殊的数据&#xff0c;即特殊字符"&#xff0c;本身输入双引号也不是什么特殊的字符&#xff0c;毕竟在存储时就是正常字符&#xff0c;只不过在编码的时候需要转义&#xff0c;转义符是\&#xff0c;然而转义符\也是特殊字符&…

基于联合概率密度与深度优化的反潜航空深弹命中概率模型研究摘要

前言:项目题材来自数学建模2024年的D题,文章内容为笔者和队友原创,提供一个思路。 摘要 随着现代军事技术的发展,深水炸弹在特定场景下的反潜作战效能日益凸显,如何最大化的发挥深弹威力也成为重要研究课题。本文针对评估深弹投掷落点对命中潜艇概率的影响进行分析,综合利…

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…

Vim跳转文件及文件行结束符EOL

跳转文件 gf 从当前窗口打开那个文件的内容&#xff0c;操作方式&#xff1a;让光标停在文件名上&#xff0c;输入gf。 Ctrlo 从打开的文件返回之前的窗口 Ctrlwf 可以在分割的窗口打开跳转的文件&#xff0c;不过在我的实验不是次次都成功。 统一行尾格式 文本文件里存放的…