C语言--数据结构: 队列

C语言实现队列:简洁高效的数据结构 以上就是一个简洁高效的基于数组的队列的实现。队列结构体包含两个重要的成员变量:队列的容量(capacity)和队列中当前元素的数量(size)。此外,我们还需要一个数组来存储队列中的元素。在C语言中,我们可以使用数组来实现一个简洁高效的队列。本文将详细介绍如何实现一个基于数组的队列,并提供相应的源代码。接下来,我们需要实现一些基本的队列操作,包括初始化队列、判断队列是否为空、判断队列是否已满、向队列中插入元素、从队列中删除元素等。在上面的代码中,我们定义了一个最大容量为100的队列。 阅读详情

队列是先进先出结构,与栈的先进后出相反,但思路一样不是很难。

队列的应用:

  • 任务调度: 操作系统中使用队列来进行任务调度,如进程调度、I/O请求等。
  • 消息传递: 在网络通信中使用队列来传递消息。
  • 广度优先搜索(BFS): 在图的遍历中使用队列来实现广度优先搜索算法。
  • 缓存管理: 缓存中的数据通常按照队列的原则进行管理,最早进入缓存的数据最先被淘汰。

一、原理

队列的插入删除就如上图所示,结构的选择可以是链表有也可以是数组--顺序表。但是顺序表每删除一个数据就要对其余数据进行挪动,时间复杂度更大,所以我选择用链表讲解。

二、实现

我们使用不带头不循环单链表。

typedef int QListDataNode;
typedef struct QListNode
{
	QListDataNode data;//数据
	struct QListNode* next;//指向下一个节点的指针
}QListNode;
typedef struct QList
{
	QListNode* phead;//头指针
	QListNode* ptail;//尾指针
	int size;//大小
}QList;

我在这里又创建了一个结构体,来包括头指针,和尾指针,方便插入删除。

队列的访问,只访问头元素和末尾元素。所以加了size这个成员,可以让我们在写返回数据个数的时候直接返回size而不需要遍历链表,更加高效,如果对队列有什么需求都可以直接加在这个结构体里面,很方便。

链表的队列插入是尾插,删除是头删。可以避免头插、尾删时的遍历链表找尾节点的前一个节点,从而节约时间。

队列的代码除了插入和删除,也是十分简单。

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

typedef int QListDataNode;
typedef struct QListNode
{
	QListDataNode data;
	struct QListNode* next;
}QListNode;
typedef struct QList
{
	QListNode* phead;
	QListNode* ptail;
	int size;
}QList;
//初始化队列
void QInit(QList* Q);
//销毁队列
void QDestory(QList* Q);
//尾插入队列
void QPush(QList* Q, QListDataNode x);
//头删出队列
void QPop(QList* Q);
//返回队列头元素
QListDataNode QFront(QList* Q);
//返回队列尾元素
QListDataNode QBack(QList* Q);
//返回队列大小
int QSize(QList* Q);
//判断队列是非为空
int QEmpety(QList* Q);


void QInit(QList* Q)
{
	assert(Q);
	Q->size = 0;
	Q->phead = Q->ptail = NULL;
}

void QDestory(QList* Q)
{
	assert(Q);
	while (!QEmpety(Q))
	{
		QPop(Q);
	}

}

void QPush(QList* Q, QListDataNode x)
{
	assert(Q);
	QListNode* tmp = (QListNode*)malloc(sizeof(QListNode));
	tmp->next = NULL;
	tmp->data = x;
	if (Q->phead == NULL)
	{
		Q->phead = Q->ptail = tmp;
	}
	else
	{
		Q->ptail->next = tmp;
		Q->ptail = Q->ptail->next;
	}
	Q->size++;
}

void QPop(QList* Q)
{
	assert(Q);
	if (QEmpety(Q))
	{
		return;
	}
	if (Q->phead == Q->ptail)
	{
		free(Q->phead);
		Q->phead = Q->ptail = NULL;
	}
	else
	{
		QListNode* tmp = Q->phead;
		Q->phead = Q->phead->next;
		free(tmp);
		tmp = NULL;
	}
	Q->size--;
}

QListDataNode QFront(QList* Q)
{
	assert(Q);
	return Q->phead->data;
}

QListDataNode QBack(QList* Q)
{
	assert(Q);
	return Q->ptail->data;
}

int QSize(QList* Q)
{
	assert(Q);
	return Q->size;
}

int QEmpety(QList* Q)
{
	assert(Q);
	return Q->size == 0;
}


int main()
{
	QList Q;
	QInit(&Q);
	QPush(&Q, 1);
	QPush(&Q, 2);
	QPush(&Q, 3);
	QPush(&Q, 4);
	QPush(&Q, 5);
	while (!QEmpety(&Q))
	{
		printf("%d %d\n", QFront(&Q), QSize(&Q));
		QPop(&Q);
	}
	QDestory(&Q);
	return 0;
}

通过本文的介绍,读者应该对队列的概念、特性、实现方式以及在C语言中的应用有了更深入的了解。队列作为一种重要的数据结构,在算法和系统设计中具有广泛的应用。掌握队列的原理和基本操作,将有助于读者更好地理解和应用队列这一重要数据结构。

参考资料:

C语言队列数据结构源码解析:顺序队列、链式队列、循环队列 队列是一种先进先出(First In First Out, FIFO)的数据结构,它有两个主要操作:入队(Enqueue)和出队(Dequeue)。入队操作指的是在队列尾部添加一个元素,而出队操作是指移除队列头部的元素。队列的操作原则保证了数据元素的进入顺序和离开顺序是相同的。为了维护队列的先进先出特性,顺序队列通常需要以下属性:- 队首(Front):指向队列头部第一个有效数据的索引。- 队尾(Rear):指向队列尾部下一个可插入新数据的位置的索引。 阅读详情

相关推荐

多目标跟踪中使用trackeval评估dancetrack运行结果

trackeval使用

qq_46144849的博客 1783

C语言应用1:队列

1.队列 队列是一种先进先出的线性表,每次操作只允许删除表的前端节点或者后端节点。 2.应用领域 2.1.AT指令: 使用2G/3G/4G模块时,定时向服务器传输数据时,可能会产生冲突。比如定时2s通过AT_CMD1发送温湿度数据,定时10s通过AT_CMD2发送电量数据。那么每过10s就可能出现AT指令冲突。使用队列可以规避这种冲突,每隔一段时间需要发送数据时的时候,将对应的AT传入队列中,由队列进行统一管理,并定时(这个时间可以短一些,决定精度)检测队列里是否有数据,有就上传服务器。如下图所示。 2.

生活在别处u的博客 923

STK传感器配置全攻略:从光学到雷达的7种视场类型详解(附避坑指南)

本文详细解析了STK软件中传感器的7种视场类型,从基础的Simple Conic、Complex Conic到高级的SAR与EOIR,提供了完整的配置步骤与实战避坑指南。重点阐述了雷达、光学等不同物理设备的建模选择逻辑,并针对常见的“No Access”等报错问题给出了系统性的排查方案,帮助工程师高效完成卫星系统设计与任务分析。

weixin_29232507的博客 228

C++-queue:queue基本用法【q.push(x)、q.front()、q.back()、q.pop()、q.size()、q.empty()】

为了降低时间复杂度,将数组当作一个首尾相连的圆环,分别用两个标志front、rear代表队列的头部和尾部。删除元素时,队首标志往后移,添加元素时,若队尾没有空间,考虑数组的头部空间若还有,则在队头添加元素,防止数组内存空间的流失。出队操作:数组头部元素出队之后,头部之后的元素均需要往前移动一个位置,时间复杂度为O(n)设置一个标志变量flag,同时满足front=rear且flag=1时为满队列。入队操作:在数组的末尾添加元素,时间复杂度为O(1)链表头为队列头部,链表尾为队列尾部。空一个元素,保持为空。

u013250861的博客 2万+

金现代面试题—— i++,++i, &&,&|自动装箱和自动拆箱(int,byte,float等)|取int等基本类型的最大值

public static void main(String[] args){ int i=1,j=1; if(i++==2&amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;++j==2){ i=7; } System.out.println(“i=”+i+”,j=”+j); } 请给出 输出结果:

老孟嘚吧嘚 1396

某10kV纺织厂供电系统设计【CAD图纸源码+Word文档】

本文详细介绍了设计变电所原始资料,负荷统计,基于负荷统计给出了变压器的选型,变电所主接线方式的设计、高低压母线、电缆的技术要求、短路电流的计算以及相关电气设备的保护参数及保护定值的计算、安全措施的规定。

weixin_761237174的博客 2742

C语言--队列的创建及使用详解

队列结构是一种变相的链表结构,相比于单独的链表,它多了一个包含队头指针和队尾指针的结构体,但其实质上,仍旧属于链表结构。只要掌握了链表结构,队列结构的实现会变得比较简单。

2301_77637225的博客 3378

MuJoCo 机械臂关节空间阻抗控制Impedance实现(附代码)

阻抗控制通过调整关节的刚度和阻尼,让机器人在接触时产生顺应性,减少冲击力,其核心目标是在接触外部载荷时能够自适应调整输出力矩,实现力与位置的协同控制。阻抗控制可以很快的到达设定位置,在此基础上,使用mujoco交互中的施加外力操作,可以看到当外力松开后,机械臂也可以很快的回弹回设定位置。其中self.Kp和self.Kd为固定刚度和阻尼系数,通过修改刚度和阻尼参数,可以变得更柔顺来应对各种场景。注释掉该行后,直接simulate仿真可以看到机械臂控制位置震荡等情况,接下来引入关节空间阻抗控制的代码。

darcsdn 1271

队列——(c语言实现)

队列,是一种先进先出(first in first out 简称FIFO)的数据结构,是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,在队列中,进行插入的一端称为队尾,进行删除的一端称为队头。

2302_77041624的博客 3694

MySQL根据idb文件恢复数据

恢复前提 MySQL 5.* 和 8.* 的恢复方式大同小异,最基本的区别是8.* 中,不再有表结构frm文件,所以要恢复 8.* 的数据,就必须要有完整的建表语句。 而恢复 5.* 的数据,就需要idb文件和 frm文件,当然,如果有完整的建表语句的话,不用frm文件也行。 恢复步骤 需要注意的是,以下操作需要选定数据库后执行。 5.* 恢复表结构 确定表列数 首先创建一张 与需要恢复数据的表 的名字相同的新表,如果已知原表的字段数量的话,就按照原表字段数建表,字段名和类型都不用考虑,如果不知道数量的话,

weixin_45121446的博客 5447

HAMi 核心模块与架构设计

HAMi 的架构设计是围绕 Kubernetes 生态系统构建的,通过扩展 Kubernetes 的调度能力和设备管理能力,为用户提供了高效、灵活的异构设备虚拟化和管理解决方案。

北斗云的博客 2552

C语言数据结构005——队列

一、队列的基本概念 (1)定义:只能在表的一端进行插入操作,在表的另一端进行删除操作的线性表。 (2)特点:先进先出 示意图如下: 二、顺序存储结构的队列 有6个存储空间的顺序队列动态示意图 顺序队列的“假溢出”问题 ①假溢出 顺序队列因多次入队列和出队列操作后出现的虽有存储空间但不能进行入队列操作的情况。 ②如何解决顺序队列的假溢出问题? 可采取四种方法: 1)采用循环队列; 2)按最大可能的进队操作次数设置顺序队列的最大元素个数; 3)修改出队算法,使每次出队列后都把队列中剩余数据元素向队头方向移动

weixin_45084986的博客 6171

Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册

前言 相比与Xilinx和Altera在国内的市场,Microsemi的FPGA在国内应用很少很少,网上几乎没有详细的教程,刚开始使用时,遇到了各种问题,自己也走了不少弯路。本系列教程以Libero V11.8.2.4,SmartFusion系列A2F200M3F FPGA芯片为例,将详细介绍Libero SoC软件的基本使用,及使用过程中遇到一些问题的解决方法。 Libero 简介 关于Lib...

whik1194的博客 3万+

C语言数据结构与算法入门:链表、栈与队列的实现

本文介绍了C语言中三种基本线性数据结构(链表、栈和队列)的实现方法。主要内容包括: 链表:通过节点指针实现动态链式结构,包含创建、插入、删除和遍历操作 栈:基于数组实现后进先出(LIFO)结构,实现入栈、出栈和获取栈顶元素等功能 队列:使用数组实现先进先出(FIFO)结构,包含入队、出队和获取队头元素操作 每个模块都提供了完整的代码示例和常见错误提示,帮助读者掌握这些基础数据结构的实现原理和应用场景。

编程世界如山海,探索不止。 2万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C语言:数据结构之队列

队列:生活中也会经常遇到的场景。即只允许在一端进行数据的插入操作,另一端进行数据的删除操作的特殊线性表。插入的一端一般为队尾(即为入队);删除的一端则为队首(即出队)。具有先进先出(FIFO)的特性。在这儿,我写了2种队列:顺序队和链式队。先来说说顺序队:出队的方法:①队头不变,出队后所有元素向前移动;②不移动元素,每删除一个元素,队头就向后移动一个元素。①队头位置不变:如下图所示:缺点:如果元素...

Yinghuhu333333的博客 439

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C语言之数据结构:队列

本文重点描述队列的定义和操作。顺序队列、循环队列,链式队列。1. 队列定义队列:只允许 在一端进行插入数据操作,在 另一端进行删除数据操作的特殊线性表,队列具有 先进先出 FIFO(First In First Out)入队列:进行插入操作的一端称为队尾Front.出队列:进行删除操作的一端称为队头Rear.空队列:不包含任何元素的空表。(顺序存储)或(链式存储)。2. 队列结构3. 关键操作​​No.操作描述1initQueue初始化队列2。

云纳星辰怀自在 859

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

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

柿子__ 1261

C语言数据结构:队列

C语言实现数据结构:队列

D180230的博客 732

c语言的数据结构:队列

无论是栈,队列,抑或是树,它们基本都是由顺序表,链表这些基本的元素构成的,并且人们将栈,队列等一些数据结构发明出来也是为了根据人类的需求解决人类的一些问题,举一个例子,医院叫号排队,为了防止有些人乱插队从而引起的不必要的纠纷,于是以数据结构队列为基本原理开发出有关排队就医的系统。设置两个结点指针phead和ptail,例如我们每次进行一次尾插操作,就让ptail指向新的尾结点,如此一来,ptail便一直指向尾结点,每当我们需要取去寻找尾结点是,可以直接使用ptail,就不需要再去从头开始遍历了.

m0_73426459的博客 1016

C语言 : 数据结构 -> 队列

1.LinkedQueue 链式队列 #include<stdio.h> #include<stdlib.h> #define ERROR -1 typedef int ElementType; typedef struct LNode * PtrNode; //定义结点结构 struct LNode{ ElementType data; PtrNode next;...

一只彩乌鸦 2094

数据结构初级(C语言版):队列 , 什么是队列?如何用C语言实现队列?

数据结构初级(C语言版):队列 , 什么是队列?如何用C语言实现队列?

m0_70088853的博客 300

【数据结构】基础:队列(C语言)

摘要:本文对队列进行简单的介绍,并对其分析与实现

qq_66725576的博客 550

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

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

L_Z_J_I的博客 771

数据结构:队列的C语言实现

队列(Queue),是一种特殊的线性表,其元素的逻辑关系是线性关系,其特殊性体现于只能在一端做插入运算,另一端删除元素。队列表现先进先出(FIFO)的特点。 队列的基本运算如下: createQueue():创建队列 isEmpty(Queue queue):判空 getFirstElem(Queue queue):得到队头元素 addElem(Queue& queue, QueueTy...

Kevin的博客 1349

C语言实现基础数据结构:链表、栈与队列详解

数据结构是计算机程序的底层骨架,直接影响算法效率与系统性能。链表、栈和队列作为三大基础线性结构,通过指针链接或连续存储实现数据组织。C语言因其贴近硬件的特性,能清晰展现数据在内存中的物理结构,特别适合学习底层实现原理。指针操作和手动内存管理可深入理解时间复杂度/空间复杂度的本质,这种能力对开发操作系统、数据库等系统软件至关重要。本文以工程实践为导向,详解单链表(含快慢指针技巧)、顺序栈/链式栈实现,以及循环队列的模运算优化,并给出Valgrind内存检测等实战调试方法。

weixin_31856057的博客 315

【数据结构:队列】——队列的实现(C语言)

1、什么是队列? 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列和出队列。 队尾:进行插入操作的一端 队头:进行删除操作的一端 ...

紫阳战君的博客 258
上一篇: C语言--数据结构: 栈
下一篇: C语言--数据结构:树
microlovw
博客等级 码龄3年 283粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值