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):指向队列尾部下一个可插入新数据的位置的索引。 阅读详情

相关推荐

如何实现MCGS与S7-200SMART PLC以太网多台通信控制?

第九步:(设备工具箱—设备管理—鼠标依次点击通用TCP/IP父设备—西门子_ Smart200到设备窗口里面去)数据类型:第0位(指PLC地址变量小数点后面的位数,例如我地址是M0.0,那么在数据类型应填写通道的第00位)第十步:(鼠标双击打开通用TCPIP父设备0--[通用TCP/IP父设备]进入通信配置)通道地址:0(指小数点前面起始字节的地址,例如我地址是M0.0,那么应在通道地填写0)。第七步:(选择通用TCP/IP父设备,点击新增,右侧选定设备就会自动添加进去。

u010670857的博客 6716

C语言应用1:队列

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

生活在别处u的博客 923

保姆级教程:在摩尔线程MTT S80上快速部署Ollama运行DeepSeek R1模型(附性能测试)

本文提供了一份详细的保姆级教程,指导用户在摩尔线程MTT S80显卡上部署Ollama并运行DeepSeek R1模型。内容涵盖从驱动安装、Docker环境配置到模型拉取、性能测试的全流程,并分享了实测数据与优化技巧,旨在帮助开发者快速在国产GPU平台上实现高效的大语言模型推理。

weixin_29091837的博客 523

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万+

【Linux】实际项目应该如何完成?--安防监控系统项目的总结

到目前为止我也做个5、6个嵌入式项目,但以往都是从零开始自己做,也就是毫无计划,想到那里做那里,有想法就会去实现,就这样导致我碰到了很多坑,也消耗了我许多时间,当然,不是说这样不好,因为在其中我也得到了一个很好的锻炼与练习,但是这不适用于在工作中去这样做。...

修成真的博客 6726

最新版 Akamai 逆向 风控破解

经过测试,捷星 jetstar.com,德州仪器 ti.com,w6 wizzair.com,还有一些航空公司的都是可以实现一个并发的有需要的可以。

m0_72605044的博客 6618

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

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

2301_77637225的博客 3378

STM32 HAL库状态机实现按键多事件检测(无阻塞高效处理)

本文详细介绍基于STM32 HAL库的状态机实现按键多事件检测方法,包括单击、双击等高效无阻塞处理。通过定时器中断和GPIO中断优化,结合状态机设计,显著提升系统响应效率和实时性,适用于嵌入式系统开发。

tech5的博客 1016

队列——(c语言实现)

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

2302_77041624的博客 3694

高温环境下RS485通信故障分析与MOS管解决方案

RS485通信作为工业控制领域的基础总线技术,其可靠性直接影响系统稳定性。在高温等恶劣环境下,传统三极管开关电路会因温度特性导致通信故障。通过分析三极管Ube电压随温度变化的特性,揭示了电路失效的物理原理。相比之下,MOS管作为电压控制型器件,具有温度稳定性好、功耗低等优势,更适合工业环境应用。本文通过一个发动机舱内RS485通信故障的实际案例,详细对比了三极管与MOS管在高温环境下的性能差异,并给出了具体的电路改进方案。该案例对工业通信接口设计具有普遍参考价值,特别适用于需要应对高温、振动等挑战性环境的硬

weixin_42612405的博客 406

12、控件使用之录入英文、阿拉伯数字删除增加功能及二维码显示

控件使用之录入英文、阿拉伯数字删除增加功能及二维码显示1、用到的控件2、添加控件2.1、添加【文本录入】控件2.1、添加【文本显示】控件2.1、添加【QR 二维码】控件3、保存工程及生成文件4、下载文件 1、用到的控件   需要用的显示控件为【文本显示】控件和【QR二维码】控件,以及触控控件【文本录入】控件。 2、添加控件 2.1、添加【文本录入】控件   【文本录入】控件也叫【ASCI 文本录入】,是用来录入ASCI 字符,打开 DGUS 软件,点击【触控控件】—【文本录入】,用鼠标框选一个区域,即可在右

嵌入式羊圈 625

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

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

weixin_45084986的博客 6171

【Power Compiler手册】4.saif文件

功耗计算的准确性取决于切换活动数据的准确性。这些数据是通过使用RTL仿真或门级仿真生成的,并存储在SAIF文件中。在执行功耗优化和分析之前,应该使用SAIF文件来反标设计对象上的切换活动信息。SAIF是由Synopsys支持的ASCII格式,用于促进不同Synopsys工具之间的信息交换(参见IEEE 1801标准,附录J)。使用`read_saif`命令读取SAIF文件,使用`write_saif`命令写出SAIF文件。有关更多信息,请参见`read_saif`和`write_saif`命令的手册页。

QRBQ 2186

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

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

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

假人有限元模型

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言:数据结构之队列

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

Yinghuhu333333的博客 439

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言之数据结构:队列

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

云纳星辰怀自在 859

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数据结构:队列和循环队列-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、付费专栏及课程。

余额充值