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

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

目录

前言

一、循环队列

1.循环队列头文件及函数声明 

2.初始化

3.入队

4.获取队头元素 

5.出栈

 6.清空与销毁

1.清空

2.销毁

8.循环队列源文件及整体函数实现 

总结
 


前言

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

循环队列,实际本身是一个顺序表,但是因为顺序表进行删除非尾部元素时,其的时间复杂度较大,所以我们将一个顺序表假想成一个环形,那么我们的插入和删除操作时间复杂度都是O(1),使这种结构的资源消耗降低,如下图所示。

 同时我们存在队头和队尾指针(实际为数组下标值),但是如果按照以往的习惯(front == tail),这种判断混淆了空队列和满队列,所以我们选择抛弃一个元素位,即以(tail  + 1 == front)来判断是否为满队列。

当然,也可对其添加计数来判断,这里不做过多赘述。

同时,这里要注意,由于将顺序表假想成环形,所以我们这里的顺序表失去了扩容的能力,实际为一个不定长顺序表。


一、循环队列

1.循环队列头文件及函数声明 

我们可以新建头文件"queue.h"对顺序表函数声明进行保存,方便我们后期查看及使用

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define INIT_SIZE 100

typedef int Element;

typedef struct Queue
{
	Element* base;
	int front;
	int tail;
}Queue, * PQueue;

//初始化
void Init_Queue(PQueue pq);

//入队
bool Push(PQueue pq, Element val);

//出队(如果出队成功,则返回出队的值)
bool Pop(PQueue pq, Element* rtval);

//获取队头元素值(如果成功,则返回队头值)
bool Top(PQueue pq, Element* rtval);

//获取有效值个数
int GetSize(PQueue pq);

//判空
bool IsEmpty(PQueue pq);

//判满
bool IsFull(PQueue pq);

//清空
void Clear(PQueue pq);

//销毁
void Destroy(PQueue pq);

//打印队列
void Show(PQueue pq);

2.初始化

我们需要一个循环队列的表头来帮助我们储存相关信息:

1.一个指向队列的指针;

2.队头和队尾下标指示;

那么我们可以定义如下的一个结构体:

 我们将队列的容量设置为100;

#define INIT_SIZE 100

typedef int Element;

typedef struct Queue
{
	Element* base;
	int front;
	int tail;
}Queue, * PQueue;

接着我们实现一个初始化函数来对以上内容进行初始化:

//初始化
void Init_Queue(PQueue pq)
{
	assert(pq != NULL);
	pq->base = (Element*)calloc(INIT_SIZE, sizeof(Element));
	if (pq->base == NULL)
	{
		exit(1);
	}
	pq->front = pq->tail = 0;
}

  完成以上操作,我们就得到一个简单的空的队列,接下来可以对其进行相关操作。

3.入队

对数据进行入队,即是直接对队列中顺序表尾部进行插入操作,即是在tai位置进行插入。

//入队
bool Push(PQueue pq, Element val)
{
	assert(pq != NULL);
	if (IsFull(pq))
	{
		return false;
	}
	pq->base[pq->tail] = val;
	pq->tail = (pq->tail + 1) % INIT_SIZE;
	return true;
}

4.获取队头元素 

这里与出队基本相同,但是无需删除数据。

rtval是输出参数,帮助获取队头元素。

//获取队头元素值(如果成功,则返回队头值)
bool Top(PQueue pq, Element* rtval)
{
	assert(pq != NULL);
	if (IsEmpty(pq))
	{
		return false;
	}
	*rtval = pq->base[pq->front];
	return true;
}

5.出栈

rtval是输出参数,帮助获取出队元素。

//出队(如果出队成功,则返回出队的值)
bool Pop(PQueue pq, Element* rtval)
{
	assert(pq != NULL);
	if (IsEmpty(pq))
	{
		return false;
	}
	*rtval = pq->base[pq->front];
	pq->front = (pq->front + 1) % INIT_SIZE;
	return true;
}

 6.清空与销毁

1.清空

当队列中数据无需使用,我们可以对队列进行清空操作,实际即是将队头和队尾指针都置为0;

//清空
void Clear(PQueue pq)
{
	assert(pq != NULL);
	pq->front = pq->tail = 0;
}

2.销毁

销毁相当于进行初始化相反的操作,将向计算机申请的内存释放,将容量置为0。

//销毁
void Destroy(PQueue pq)
{
	Clear(pq);
	free(pq->base);
	pq->base = NULL;
	pq = NULL;
}

8.循环队列源文件及整体函数实现 

源文件:"queue.c"

 

#include "queue.h"

//初始化
void Init_Queue(PQueue pq)
{
	assert(pq != NULL);
	pq->base = (Element*)calloc(INIT_SIZE, sizeof(Element));
	if (pq->base == NULL)
	{
		exit(1);
	}
	pq->front = pq->tail = 0;
}

//入队
bool Push(PQueue pq, Element val)
{
	assert(pq != NULL);
	if (IsFull(pq))
	{
		return false;
	}
	pq->base[pq->tail] = val;
	pq->tail = (pq->tail + 1) % INIT_SIZE;
	return true;
}

//出队(如果出队成功,则返回出队的值)
bool Pop(PQueue pq, Element* rtval)
{
	assert(pq != NULL);
	if (IsEmpty(pq))
	{
		return false;
	}
	*rtval = pq->base[pq->front];
	pq->front = (pq->front + 1) % INIT_SIZE;
	return true;
}

//获取队头元素值(如果成功,则返回队头值)
bool Top(PQueue pq, Element* rtval)
{
	assert(pq != NULL);
	if (IsEmpty(pq))
	{
		return false;
	}
	*rtval = pq->base[pq->front];
	return true;
}

//获取有效值个数
int GetSize(PQueue pq)
{
	assert(pq != NULL);
	return (pq->tail - pq->front + INIT_SIZE) % INIT_SIZE;
}

//判空  队尾遇到队头
bool IsEmpty(PQueue pq)
{
	assert(pq != NULL);
	return pq->front == pq->tail;
}

//判满  队尾进一步等于队头
bool IsFull(PQueue pq)
{
	assert(pq != NULL);
	return (pq->tail + 1) % INIT_SIZE == pq->front;
}

//清空
void Clear(PQueue pq)
{
	assert(pq != NULL);
	pq->front = pq->tail = 0;
}

//销毁
void Destroy(PQueue pq)
{
	Clear(pq);
	free(pq->base);
	pq->base = NULL;
	pq = NULL;
}

//打印队列
void Show(PQueue pq)
{
	assert(pq != NULL);
	for (int i = 0; i < GetSize(pq); i++)
	{
		printf("%d ", pq->base[(pq->front + i) % INIT_SIZE]);
	}
	printf("\n");
}

总结

以上就是今天要讲解的内容,本文简单介绍了循环队列的代码实现。队列在后期处理特殊问题上具有特殊效果。

队列之循环队列详解(C语言版) 本篇文章详细的介绍了数据结构队列中的循环队列,并用C语言对其常用操作进行了实现。 阅读详情

相关推荐

另类循环队列 (数据结构)C语言

另类循环队列(数据结果)C语言 如果用一个循环数组表示队列,并且只设队列头指针Front,不设尾指针Rear,而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作 函数接口定义: bool AddQ( Queue Q, ElementType X ); ElementType DeleteQ( Queue Q ); 其中Queue结构定义如下: typedef int Position; typedef struct QNode *PtrToQNode; struct QNode {

amicoyuan的博客 2159

数据结构—循环队列(C语言)

一、头文件 二、循环结点 三、初始化 四、插入 五、删除 六、打印 七、测试代码 八、主函数 九、全部代码 十、测试结果 十一、总结 一、头文件 #include <stdio.h> #include <malloc.h> #define MAXSIZE 5 二、循环结点 typedef struct CircleIntQueue { int data[MAXSIZE]; int head; int tail; }*CircleIntQueue

chenshengnanii的博客 2620

C语言数据结构 -- 1.循环队列

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

qq_30634911的博客 1223

入门数据结构,c语言实现循环队列实现(详细篇)。

队列中的一个分支循环队列,运用了一些技巧降低了其时间复杂度与空间复杂度,学会循环队列可以帮助更好的学习后面复杂的结构(如:树,二叉树,图等)。

A2202333的博客 5608

如何读懂CiteSpace图谱?科研小白必看的节点颜色/年轮/聚类解读手册

本文详细解析CiteSpace图谱的核心视觉元素,包括节点颜色、年轮和聚类标识,帮助科研人员准确解读数据分析结果。通过生物医学案例展示如何从图谱中识别关键文献和研究趋势,提供五步系统解读法和常见错误规避策略,助力科研小白快速掌握文献计量分析技巧。

weixin_29179311的博客 314

Claude Code 完整使用教程(2026最新版)

《Claude Code 完整使用教程(2026最新版)》摘要: Claude Code 是 Anthropic 公司推出的智能编程工具,通过自然语言对话实现代码编写、调试和重构。本教程基于 v2.1.101 版本,涵盖安装配置、核心功能及最新特性。主要内容包括: 多平台安装方式(macOS/Linux/Windows) 桌面应用专属功能如并行会话、定时任务和语音模式 模型选择指南(Sonnet/Opus/Haiku) 快速入门示例:5分钟创建Node.js项目 核心功能:代码读写、命令执行、Git集成等

程序猿_三产 2万+

【数据结构】循环队列(C语言实现)

史上最详细的循环队列讲解!不怕你不会,就怕你不点进来!

Hello_World_213的博客 9979

Hadoop在大数据领域的电商数据分析案例

随着电商行业的迅猛发展,每天都会产生海量的数据,如用户浏览记录、购买行为、商品信息等。如何从这些数据中提取有价值的信息,为电商企业的决策提供支持,成为了电商企业面临的重要问题。Hadoop作为一个开源的分布式计算平台,具有高可靠性、高扩展性和高效性等特点,能够很好地处理大数据。本文的目的就是通过实际案例,详细介绍Hadoop在电商数据分析中的应用,范围涵盖了从数据采集、存储到分析的整个流程。本文首先介绍背景信息,让读者了解Hadoop在电商数据分析中的重要性和应用场景。

Java大师兄的博客 1178

C语言数据结构Queue----循环队列

无论是单片机还是MCU设备,数据处理应用中经常要使用FIFO队列,而Queue循环队列就是最经典、最基础的数据结构应用。通过大学学习的数据结构导论,结合自己的项目实践,用C语言描述和实现了循环队列的功能。队列简称队,也是一种运算受限的线性表,其规则允许在线性表的一端插入数据,另一端删除数据,插入数据的一端叫做队尾(rear),删除的一端叫做队首(front)。新插入队尾数据的动作叫入队,从队首删除数据的动作叫做出队。出队后,它的后继元素数据将成为新的队首,如果后继数据为空,队列将为空队列。...

C/C#、Android driver、STM32、Linux等等。 2690

FPGA打砖块游戏设计(有上板照片)VHDL

这是一款经典打砖块游戏,我们的努力让它更精致更好玩,我们将它取名为打砖块游戏(Flyball),以下是该系统的一些基本功能: 画面简约而经典,色彩绚丽而活泼,动画流畅 玩家顺序挑战3个不同难度的级别,趣味十足 计分功能,卡通字母数字 4条生命值,由生命条显示 游戏结束画面,缓缓浮起与缤纷刷色的特效 四键操作,可复位,可暂停,高灵敏 96块砖拼出可爱的“囧”字,方便更改 碰挡板非镜面反射 初始启动,随机的发射速度。

QQ_778132974的博客 1660

柑橘病虫害识别方案总结

1. 方案一 1.1 赛题背景 1.2 数据分析 1.3 模型设计 1.3.1 模型具体方案 1.3.2 模型设计 1.4 实验结果 1.5 总结与展望 2. 方案二 2.1 赛题介绍 2.2 数据分析 2.3 算法方案解析 2.3.1 检测模型 2.3.2 提升策略 2.4 优化思路 3. 方案三 3.1 数据分析 3.1.1 数据说明 3.2 技术展示 3.2.1 数据输入端 3.2.2 模型结构端 3.2.3 上下文信息 3.2.4 训练优化端 3.2.5 创新性分析 3.3 算法及系统思考.....

herosunly的博客 2万+

循环队列(C语言)

循环队列(Circular Queue),也被称为环形队列或循环缓冲区,是一种队列数据结构,它具有固定大小的缓冲区,允许在队列的前面和后面插入和删除元素。与普通队列不同,循环队列可以避免浪费存储空间的问题,因为当队列的尾部元素达到缓冲区的末尾时,它可以"循环"到缓冲区的开头。

weixin_54454406的博客 1891

从LLM到VLM再到VLA:三兄弟的“变形记”——定义、架构演进与最新趋同

LLM、VLM、VLA虽然在时间上依次出现,但它们在架构上的演进并非线性替代,而是形成了一个从“理解语言”到“理解世界”再到“改变世界”的认知闭环。VLA之所以能在短短三年内从概念走向现实,正是因为它站在了LLM和VLM的肩膀上——RT-2的泛化能力来自互联网规模的VLM预训练,π0的扩散策略受益于生成式模型的突破,Helix的双系统架构借鉴了“快慢思考”的认知科学洞见。而反过来,VLA在实际部署中遇到的效率瓶颈和实时性要求,也在倒逼LLM和VLM向更轻量、更高效的架构方向演进。

Ven%的博客 490

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

在 SAP BAS 中扩展标准 SAP Fiori 应用并部署到 ABAP 环境的完整实践指南

SAPUI5 Adaptation Project 摘要(148字) SAPUI5 Adaptation Project 提供了一种高效扩展标准Fiori应用的方式,通过创建应用变体(Application Variant)实现差异化定制。开发者可在SAP BAS中使用可视化编辑器修改UI元素(如隐藏字段、调整表格布局、添加按钮等),而无需重写业务逻辑。变体部署到ABAP环境后,可与标准应用并行使用,且能随原应用升级保持同步。典型应用场景包括为不同用户角色定制简化界面或增强特定功能,既满足个性化需求,又保留

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 184

ATT MTU 交换机制:提升 BLE 数据传输效率的关键

在低功耗蓝牙(BLE)技术的面试中,ATT MTU 交换机制始终是高频考点。无论是芯片厂商的固件开发岗,还是物联网设备的协议栈调试岗,面试官都爱通过这个知识点考察候选人对 BLE 数据传输底层逻辑的理解。本文将系统梳理核心考点,结合历年真题详解应答思路,轻松应对这类问题。​

byte轻骑兵的技术小窝 2411

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

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

qq_44025638的博客 7624

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

#include #include //定义函数结果状态码 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 //定义循环队列空间大小 #define QUEUESIZE 20 //定义数据类型 typedef int ElemType ; //定义程序返回状态类型 typedef int State; //循环队列存

二手码农的工地 8378

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

sinat_34450204的博客 45万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构:队列和循环队列-C语言实现

数据结构:队列和循环队列(有图和超详细的注释,C语言实现)

柿子__ 1261

C语言数据结构——队列(循环队列)

C语言数据结构——队列(循环队列) 前言: 常见的队列数据结构有两种,原则都是“先进先出”。一种是直线的队列,这种队列相对内存而言是不合理的,因为不能够重复使用。另外一种是循环队列,这种队列的设计巧妙之处就在于数组内部空间可以重复使用,但是也存在这一些不足之处,比如,解决追赶问题,如何定义什么时候为空、什么时候为满。本章博客就是解决这个问题。 1、在这里定义的结构体成员 front充当一个队头的位置,用来打印数据; rear充当一个队尾的位置,用来插入数据; data[]数组用来存储数据,长度为10; qu

weixin_45062087的博客 1577

C语言数据结构学习:循环队列

C语言数据结构学习:循环队列

L_Z_J_I的博客 507

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

C语言——循环队列的实现 1.循环队列 循环队列可以理解为一个环,实际上是将一个普通队列的尾部连上头部构成的,所以在实现循环队列时,需要两个指针front和rear分别指示队列头元素及队列尾元素的位置。 在初始化建空队列时可以另front=rear=0,这样当插入新元素时,尾指针rear加1表示向后移动一位,同理,当删除队列头元素时,头指针front加1表示队列头部一个元素出队列,下一个元素成队首...

swy66的博客 753

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

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

不僈的博客 894

算法与数据结构【四】——C语言实现循环队列

队列是另一种经典数据结构,也是有两种,一是静态队列,即数组实现的循环队列,二是用链表实现的动态队列,今天我写的是循环队列,下面我就详细分析一下循环队列我认为不太好理解的几个点 第零,循环队列的构成,用一个结构体表示的话是这样的: typedef struct queue{ int *pBase;//内部实现队列的数组,用于储存元素 int front;//指向队列第一个元素

NKPDQZ的博客 890

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

//循环队列 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 5 typedef int ElemType; typedef struct { ElemType datas[MAXSIZE]; int front; int rear; } Queue; // 1 栈队列S的初始化操作。 void InitStack(Queue *S); // 2)毁队列 void DestroyStack(Q......

weixin_62439745的博客 516
上一篇: 【C语言数据结构】栈(顺序栈+链栈)
下一篇: 【C语言数据结构】链队列
W1024201
博客等级 码龄5年 69粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值