【C语言数据结构】07.循环队列

数据结构-循环队列详解(c语言版) 本文主要介绍了循环队列的一些概念特点和C语言代码实现以及一些应用场景。 阅读详情

前言

  • 本节主要进行C语言数据结构循环队列的学习。

在这里插入图片描述

“性痴则志凝,故书痴者文必工,艺痴者技必良。” ——《聊斋志异·阿宝》



1.队列的介绍

  • 循环队列是一种顺序表示的队列,用一组地址连续的存储单元依次存放从队头到队尾的元素。
  • 由于队列中队头和队尾的位置是动态变化的,要附设两个指针 front 和 rear ,分别指示队头元素和队尾元素在数组中的位置。
  • 初始化队列时,令 front = rear = 0。
    在这里插入图片描述
  • 此节,不使用链表,直接使用数组实现队列。

2.结构体指针实现队列

  • 实现内容与前章相同,1.初始化队列;2.入队;3.出队;4.遍历队列。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define MAXSIZE 5
//因为如果存满MAXSIZE个数,而faont与rear相等时,无法区分队列是满还是空;因为使用牺牲rear指向的一个元素,如MAXSIZE==5,则只存4个:当faont与rear+1相等时即认为满,不再往rear里写入;faont与rear相等时为空
typedef struct Node//定义数据结构
{
    int faont;
    int rear;
    int data[MAXSIZE];
}Node;

Node* initList()//初始化头节点
{
    Node* Queue=(Node*)malloc(sizeof(Node));
    Queue->faont=Queue->rear=0;
    return Queue;
}

bool isFull(Node* Queue)//检查队列是否为满
{
    if((Queue->rear+1)%MAXSIZE==Queue->faont)//加满5个则重新计数
        return 1;
    else 
        return 0;
}

bool isEmpty(Node* Queue)//检查队列是否为空
{
    if(Queue->rear==Queue->faont)
        return 1;
    else 
        return 0;
}

bool enQueue(Node* Queue,int data)//入队
{
    if(isFull(Queue))//入队前判是否为满
        return 0;
    else
    {
        Queue->data[Queue->rear]=data;
        Queue->rear=(Queue->rear+1)%MAXSIZE;
        return 1;
    }
}

int deQueue(Node* Queue)//出队
{
    if(isEmpty(Queue))//出队前判是否为空
        return 0;
    else
    {
        int data=Queue->data[Queue->faont];
        Queue->faont=(Queue->faont+1)%MAXSIZE;
        return data;
    }
}

void printList(Node* Queue)//遍历操作
{
    int count=(Queue->rear - Queue->faont+MAXSIZE)%MAXSIZE;
    int index=Queue->faont;
    for (int i = 0; i < count; i++)
    {
        printf("%d->",Queue->data[index]);
        index=(index+1)%MAXSIZE;
    }
    printf("NULL\n");
}

int main()
{
    Node* Queue= initList();//初始化头节点,创捷队列
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    enQueue(Queue,1);
    printList(Queue);
    enQueue(Queue,2);
    printList(Queue);
    enQueue(Queue,3);
    printList(Queue);
    enQueue(Queue,4);
    printList(Queue);
    enQueue(Queue,5);
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    system("pause");
}

在这里插入图片描述

参考资料:
链接: UP从0到1带你手撕数据结构全集(C语言版)

C语言数据结构 -- 1.循环队列 队列是一种先进先出(FIFO)的线性数据结构,数据从队尾加入,从队首移除。循环队列是队列的优化实现,通过将存储空间视为环形结构,重复利用出队后释放的空间。文章详细介绍了如何使用C语言实现循环队列,包括数据结构的定义、队列的创建与销毁、入队与出队操作,以及判断队列是否为空或满的函数实现。还提供了完整的代码示例,包括头文件、实现文件和主测试文件,展示了如何创建、测试和销毁循环队列的过程。通过代码实现,可以清晰地理解循环队列的工作原理及其在编程中的应用。 阅读详情

相关推荐

大麦APP抢票协议分析:从‘掌密网络’代码看移动端API安全防护

本文深度解析了大麦APP抢票协议的安全防护体系,重点分析了'掌密网络'代码中体现的动态签名、设备指纹和人机验证等关键技术。文章详细介绍了大麦APP如何通过多层次API安全防护应对抢票压力,包括参数加密、请求头部设计和异常处理机制,为移动应用开发者提供了安全实践建议。

weixin_28740299的博客 289

【数据结构】队列的实现及循环队列的实现详解(c语言)

通过下图可以看到定义了两个结构体,第一个结构就是我们常用的节点,而第二结构体中的成员可以理解为head指针是用来指向队头的tail指针是用来指向队尾的size用来反应队列中的元素个数,看到这肯定会有一些疑问,为什么要这样定义呢,这样定义的好处是什么1.这样定义的好处上文我们说了实现队列要用尾插头删来实现当入队的时候尾插需要找到队列的尾,这样就需要把队列遍历一遍,此时入队列的时间复杂度为O(n)而我们使用tail指针指向尾,在尾插的时候就可以不用再遍历队列了,这时入队列的时。

m0_72532428的博客 3785

Nginx健康检查实战:如何用第三方模块提升服务可用性(附详细配置)

本文深入探讨了如何通过集成第三方健康检查模块来提升Nginx的服务可用性。文章对比了Nginx默认被动检查的局限性,并详细介绍了主动健康检查的核心优势、主流模块选型,以及以nginx_upstream_check_module为例的实战部署与配置指南,帮助运维人员构建更可靠的负载均衡架构。

weixin_28331555的博客 307

队列OJ题 --- 设计循环队列

选用数组来实现也是一样需要front 和rear的,而此时front 和 rear都是下标,同样的,为了解决 front == rear 是满还是空的问题,我们仍然认为rear+1 == front是满,所以要存放K个数据,我们需要 k+1个位置来存储~上图也是满了的情况,rear = 1, (rear+1) % (k+1) == 2 就等于front, 因为当 rear 比 k 小了,被除数肯定比除数小,%还是被除数,所以取模没有任何影响,因此取模这段代码就解决了判满问题~

C/C++技术栈 278

b站视频链接快速获取

快速获取b站视频数据

qq_45889931的博客 7743

数据结构学习之_循环队列

/* 2013年3月26日 21:40:14 xulei 队列: 满足先进先出的序列. 通常可分为: 链式队列(内部是链表), 静态队列(内部是数组) 队列的第一个节点: 队头(front), 允许删除(出队), 指向第一个有效节点. 队列的最后一个节点: 队尾(rear), 允许插入(入队), 指向最后一个有效节点的下一个节点. 静态队列通常都必须是循环队列. 循环队列的操作: 如

xulystone的专栏 771

实战演练:基于Veristand Custom Device的硬件在环(HIL)数据流控制模块开发

本文详细介绍了基于Veristand Custom Device的硬件在环(HIL)数据流控制模块开发实战。通过LabVIEW环境配置、动态路由逻辑构建、实时处理核心开发及性能优化等关键步骤,帮助工程师快速掌握定制化HIL测试系统的开发技巧,提升测试效率与准确性。

weixin_29206669的博客 475

循环队列数据结构

本文介绍循环队列数据结构,最后我们用C代码进行实现。循环队列是正常队列的扩展,其最后元素连接第一个元素,这样形成类似环的数据结构。循环队列的应用包括CPU调度、内存管理以及流量管控等。 循环队列定义 循环队列主要为解决正常队列的限制。正常队列在执行插入和删除动作之后,会产生不可用的空间。 | 正常队列信息 这里索引 0 和 1 位置只有重置队列(删除所有元素)才能使用,因此实际能使用的空间比队列容量小。因为正常队列增加元素是会根据尾指针位置判断是否已满,因为尾指针指向最后,所以不.

neweastsun的专栏 3688

【Zephyr电源与功耗专题】13_PMU电源驱动介绍

本文介绍的PMU芯片包含2路DCDC和6路LDO,在Zephyr实时操作系统下实现了完整的电源管理解决方案。

zero的博客 842

YOLOv11的网络结构概览(Backbone-Neck-Head):介绍骨干网络(Backbone)、特征融合层(Neck)和检测头(Head)的作用

YOLOv11架构解析:从特征提取到目标检测 YOLOv11继承了YOLO系列的经典三组件架构,包含Backbone、Neck和Head三部分。Backbone基于改进的CSPDarknet,通过Conv和C3模块进行多尺度特征提取;Neck采用FPN+PAN结构融合不同层次特征;Head负责检测任务输出。网络整体设计注重高效性和多尺度特征融合,采用C3模块优化信息流和梯度流,配合SPPCSPC增强特征表达能力。该架构在保持实时检测速度的同时,提升了目标检测精度,体现了YOLO系列"一次看全图&q

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1万+

【链表】练习题

学习数据结构期间做的题目

m0_63077733的博客 886

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 346

【数据结构】PTA 另类循环队列 C语言 【详】

其中Queue/* 存储元素的数组 *//* 队列的头指针 */int Count;/* 队列中元素个数 *//* 队列最大容量 */注意:如果队列已满,AddQ函数必须输出“Queue Full”并且返回false;如果队列是空的,则DeleteQ函数必须输出“Queue Empty”,并且返回ERROR。

2302_79596028的博客 1268

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【C-数据结构】循环队列

容量(判空、判满、大小)

m0_56655520的博客 597

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

在c中利用数组实现循环队列

(FIFO, First In First Out)的原则,这意味着第一个被插入队列的元素是第一个被移出队列的元素。这里我实现了队列的出队入队以及遍历的基本操作,主要是利用count作为标识检测队列情况。队列(Queue)是一种常用的数据结构,属于线性数据结构的一种。操作队列即操作受限的表,两端操作,队列头出队,队列尾入队。- dequeue/poll 出队,`轮询`- enqueue/add/put 入队。- peek 读取队列中第一个元素。- size 队列大小。- clear 清空。

qq_2835172088的博客 309

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

循环队列C力扣

tip:自己需要什么方便解题就怎么来。

zt3445164952的博客 470

设计循环队列 - 力扣(LeetCode)C语言

(点击前面链接即可查看)一、题目设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。FrontReardeQueue()isEmpty()isFull()// 设置长度为 3// 返回 true。

SikJ_2020_10_24的博客 495

Python-ctypes,每日实现一个C语言数据结构挑战!

用Python的ctypes库,通过DLL调用C语言函数来实现数据结构,主打一个混编。今日的是循环队列SqQueue。

2303_79350799的博客 285

数据结构 3.7: 循环队列

整除的作用.想像操场跑道里放一队人, 循环的感觉就出来了.为了区分空队列与满队列, 需要留一个空间. 相当于不允许首尾相连. 还是画个图吧, 否则容易进坑.用链式结构, 空间的分配与回收由系统做, 用循环队列, 则是自己把控. 想像自己写的是操作系统, 从这个代码可以感受下内存的管理.

2302_79340870的博客 334

C语言实现循环队列

详解循环队列的巧妙之处

qq_43629857的博客 1万+

数据结构(C语言)-循环队列基本操作

文章首发于 2020-10-15 知乎文章:数据结构(C语言)-循环队列基本操作 作者:落雨湿红尘(也是我o) 01.队列介绍 队列是一种先进先出(first in first out,FIFO)的线性表,是一种常用的数据结构。 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 ...

qq_44025638的博客 7624

【C语言】【LeetCode】循环队列

【C语言】【LeetCode】循环队列

石墨博客 1507

C语言 数据结构 循环队列的表示和实现

定义顺序存储的循环队列存储结构 编写循环队列的各种基本操作实现函数 文章目录1 循环队列结构2 基本操作函数3 整体代码test4.cLQueue.h4 运行结果5 附加题LQueuePlus.htest4Plus.h 队列是先进先出的结构 front指向队头,元素出队 rear指向队尾,元素入队 1 循环队列结构 typedef struct LoopQueue { DataType data[MAXSIZE]; int front; //队头索引,指向队列第一个数据所在位置 in

C语言/数据结构/数学建模/深度学习/生物信息 2488

【数据结构】 循环队列的基本操作 (C语言版)

【数据结构】 循环队列的基本操作 (C语言版)

weixin_56814370的博客 3336

循环队列–C语言实现–数据结构

循环队列–C语言实现–数据结构目录循环队列C语言实现数据结构目录 一 要求 二 循环队列 三 循环队列的算法设计 1 建立循环队列 2 置空队列 3 入队 4 出队 5 打印队 四 程序 1 程序的结构 2 程序源码 五 程序测试 1 入队列 2 出队列 3 打印队列 六 源程序及封装软件下载 下载地址 格格是一枚智能专业的本科在校生很愿意和各位大佬交流如果大家有愿意交朋友的可以加格格的QQ4460

sinat_34450204的博客 45万+
上一篇: 【牛客刷题专栏】0x02:带头节点单链表实现C数据结构栈
下一篇: 【电源设计】12电源芯片详细选型攻略
不僈
博客等级 码龄8年 2万+粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不僈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值