跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

循环队列原理与 C 语言实现详解

循环队列通过牺牲一个存储单元来区分队空与队满状态,有效解决了顺序队列的空间浪费问题。其核心逻辑在于利用取模运算实现指针的回绕,队空时 front 等于 rear,队满时 (rear + 1) % size 等于 front。实现过程中需特别注意指针更新后的边界处理以及内存管理。结合 C 语言代码展示了初始化、入队、出队及判空判满的具体写法,适合深入理解底层数据结构设计。

MqEngine发布于 2026/4/8更新于 2026/10/2487 浏览
循环队列原理与 C 语言实现详解

循环队列简介

在实际开发中,队列是一种常用的数据结构,而循环队列(Circular Queue)则一般是一种基于数组实现的队列(也可使用循环链表)。与传统的 FIFO 队列相比,循环队列通过将数组首尾相连形成一个'环',能够更高效地利用内存空间。

循环队列的主要思想是:当队尾指针到达数组末端时,如果数组前面还有空余空间,就可以从数组头部重新利用这些空间进行入队操作。也就是说,数组的末端和头部通过逻辑上的连接,形成一个环状结构,从而避免了顺序队列中由于出队操作而导致的空间浪费问题。

下图展示了一个典型的循环队列结构,其中 front 表示头指针,指向队头;rear 则表示尾指针,指向队尾元素的下一个位置。

循环队列示意图

判空与判满

在循环队列中,front 与 rear 都是可以循环移动的。当队空时,front == rear 成立;当队满时,front == rear 也成立。因此显然不能只凭 front == rear 来判断队空还是队满。

为了解决这个问题,在循环队列中约定:少用一个元素空间。当队尾标识的 rear 在队头标识 front 的上一个位置时,队列为满。此时,判断队空和队满的条件分别如下:

队空时: front == rear

队满时: (rear + 1) % MAXSIZE == front

其中,MAXSIZE 是队列容量的大小。

两种情况下队列中指针的状态如下图所示:

指针状态图

既然少一个元素空间,这就意味着,如果要存储的数据个数最大为 k,那么你需要开辟的循环队列的大小应为 k+1。

循环队列的实现

下面我们以一道经典题目为例,来实现循环队列的各种操作。

设计循环队列

typedef struct {
    int* a;
    int front; // 头指针,指向队头数据
    int tail;  // 尾指针,指向队尾元素的下一个位置
    int k;     // 队列容量大小(实际开辟空间为 k+1)
} MyCircularQueue;

bool myCircularQueueIsEmpty;
 ;


MyCircularQueue*  {
    MyCircularQueue* cq = (MyCircularQueue*)((MyCircularQueue));
    cq->a = (*)(()*(k+));
    cq->front = ; 
    cq->tail = ;
    cq->k = k;
     cq;
}


  {
    (myCircularQueueIsFull(obj))  ; 
    obj->a[obj->tail] = value; 
    ++obj->tail; 
    obj->tail %= (obj->k+); 
     ;
}


  {
    (myCircularQueueIsEmpty(obj))  ; 
    obj->front = (obj->front+)%(obj->k+); 
     ;
}


  {
    (myCircularQueueIsEmpty(obj))  ;
     obj->a[obj->front];
}


  {
    (myCircularQueueIsEmpty(obj))  ;
    (obj->tail == )  obj->a[obj->k]; 
      obj->a[obj->tail];
}


  {
     obj->front == obj->tail;
}


  {
     (obj->tail+)%(obj->k+) == obj->front; 
}


  {
    (obj->a); 
    (obj);
}
(MyCircularQueue* obj)
bool
myCircularQueueIsFull
(MyCircularQueue* obj)
// 循环队列的初始化
myCircularQueueCreate
(int k)
malloc
sizeof
int
malloc
sizeof
int
1
0
// 初始化数据
0
return
// 入队
bool
myCircularQueueEnQueue
(MyCircularQueue* obj, int value)
if
return
false
// 满了就不能再入了
// 将数据入进来
// 更新 tail
1
// tail 自增了之后可能超出循环队列的大小范围所以要取模
return
true
// 出队
bool
myCircularQueueDeQueue
(MyCircularQueue* obj)
if
return
false
// 为空就不能再删
1
1
// 和前面是一样的原理,注意同样是加一再取模
return
true
// 获取队头元素
int
myCircularQueueFront
(MyCircularQueue* obj)
if
return
-1
return
// 获取队尾元素
int
myCircularQueueRear
(MyCircularQueue* obj)
if
return
-1
if
0
return
// 跨越了一个循环的情况
else
return
-1
// 判空
bool
myCircularQueueIsEmpty
(MyCircularQueue* obj)
return
// 判满
bool
myCircularQueueIsFull
(MyCircularQueue* obj)
return
1
1
// tail 的后一个是 front 说明满了,但是有可能 tail+1 跨过了一个循环。所以要取模
// 释放
void
myCircularQueueFree
(MyCircularQueue* obj)
free
// 注意这里要先释放结构体内的数组!!!不然会可能内存泄漏
free

目录

  1. 循环队列简介
  2. 判空与判满
  3. 循环队列的实现
  4. 设计循环队列

更多推荐文章

查看全部
  • 从 AI 工具使用者到创作者:技术变现之路
  • 批量文档处理自动化:DeepSeek + Python 实现多格式文件内容提取与汇总
  • Java 中 TCP TIME_WAIT 状态的作用及服务端过多的原因分析
  • AIGC 产品经理的定义、职责及与 AI 产品经理的区别
  • 基于飞算 JavaAI 的学生管理系统开发实践
  • C 语言手写哈希表:除留余数法与线性探测
  • AI 对话平台前端开发实战:从零构建聊天界面
  • OpenClaw 开源 AI 助手中文发行版部署指南:一键脚本/Docker/npm 安装
  • 想成为黑客或信息安全从业者,该如何开始?
  • LeetCode 每日一题:最小位数组问题解法详解
  • 快速排序核心原理与多种实现优化详解
  • Docker 部署 iptvnator 构建家庭媒体中心
  • uv 虚拟环境管理:venv 创建、激活与 Python 版本指定
  • PyTorch Checkpoint 机制原理与源码解析
  • Stable Diffusion 使用 LoRA 模型生成逼真人物服饰教程
  • 基于 Python 与 AI 的智能害虫识别助手
  • 基于 FPGA 的 HDMA 驱动与 8B10B 编码实现
  • 大模型对话流式响应的前端实现与实战示例
  • Spring Cloud Feign 入门实战:声明式 HTTP 客户端详解
  • 2026 年 AI 大模型实测排名与选型指南:国产模型表现亮眼

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online