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

循环队列(Circular Queue)详解

综述由AI生成循环队列的概念、判空判满条件及实现。循环队列通过数组首尾相连形成环状结构,解决顺序队列空间浪费问题。判空条件为 front 等于 rear,判满需牺牲一个单元,即 (rear + 1) % MAXSIZE 等于 front。文中基于 LeetCode 622 题提供了完整的 C 语言代码实现,包含初始化、入队、出队、获取队头队尾元素及释放内存等核心操作接口。

时间旅人发布于 2026/4/6更新于 2026/5/2128 浏览
循环队列(Circular Queue)详解

一、循环队列简介

在实际开发中,队列是一种常用的数据结构,而循环队列(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

三、循环队列的实现

我们来以具体的一道题目来实现循环队列的各种操作。

LeetCode 622. 设计循环队列

typedef struct {
    int* a;
    int front; // 头'指针'指向队头数据
    int tail;  // 尾'指针'指向队尾的下一个位置
    int k;     // 一会儿开辟的队列大小为 k+1
} MyCircularQueue;

bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool ;


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);
}
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 自增了之后可能超出循环队列的大小范围所以要取模
// 模的是循环队列的大小 k+1
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. LeetCode 622. 设计循环队列
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 驱动的对话式 PCB 设计工具实战与展望
  • Neo4j Desktop 2.0 安装及自定义路径配置指南
  • 前缀和算法实战:从一维到二维及哈希结合应用
  • Java 实现线性方程组求解:LU 分解与部分主元法
  • 缓存算法:LRU 与 LFU 原理及 Java 实现
  • OpenClaw 飞书机器人权限配置与安全指南
  • 91n 网络环境下最优 TensorFlow 镜像拉取方案
  • 无人机视觉目标检测数据集 VisDrone 详解
  • AI 智能体工具:OpenCode、OpenClaw 安装与配置指南
  • 三维模型数据结构与存储方式解析
  • OpenClaw 开源智能 AI 助理云端部署方案
  • VS Code 配置 GitHub Copilot Agent Skills 实战指南
  • C++ 函数进阶:递归与尾递归优化
  • SeekDB 详解:三行代码构建 AI 原生应用的全能数据库
  • 自然语言处理在客户服务领域的应用与实战
  • 如何用ChatGPT降低毕业论文的AIGC重复率?(最新版详细攻略)
  • Git 提交高频报错:remote rejected 与 Missing blob 解决方案
  • 直流无刷电机 FOC 控制算法详解与 STM32 实现
  • 二分算法实战:A-B 数对与烦恼的高考志愿
  • 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