队列(C语言实现)

news2025/1/19 6:57:10

文章目录:

  • 1.队列的概念
  • 2.队列的结构
  • 3.接口实现
    • 3.1初始化队列
    • 3.2判断队列是否为空
    • 3.3入队
    • 3.4出队
    • 3.5查看队头元素
    • 3.6查看队尾元素
    • 3.7统计队列数据个数
    • 3.8销毁队列

1.队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 的特点,入队列:进行插入操作的一端称为队尾,出队列:进行删除操作的一端称为队头

2.队列的结构

队列也可以数组和链表的结构实现,由于队列先进先出的特点,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,需要挪动后面的数据,效率会比较低,而链表头部的插入删除是很快的

//数据类型
typedef int QDataType;
//队列结点数据
typedef struct QueueNode
{
	QDataType data;//数据(数值域)
	struct QueueNode* next;//指向下一个结点的指针(指针域)
}QNode;
//整个队列数据
typedef struct Queue
{
	QNode* head;//指向对头
	QNode* tail;//指向对尾
	int size;//数据个数(队列长度)
}Queue;

这里是使用结构体嵌套,方便我们出队入队时修改队头和队尾结点,我们直接上图理解:
链式队列结构图示:

3.接口实现

3.1初始化队列

将头尾指针置空,避免成为野指针,再将数据个数置零,方便后面统计时累加,这里断言pq是为了避免人为不小心传了空指针进来

//初始化队列
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
	pq->size = 0;
}

3.2判断队列是否为空

当队头指针和队尾指针都指向NULL时,说明队列就是空队,当然也可以使用队长size为0来判断

//判断队列是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
   //头尾指针都指向NULL时为空队
	return pq->head == NULL && pq->tail == NULL;
}

3.3入队

入队操作就是单链表的尾插,首先创建一个新结点存入目标值,如果是空队的情况就直接将新节点赋值给头尾结点指针,通常情况先将尾结点指向新节点,再将队尾指针指向新节点即可,同时队列长度+1,这里因为需要修改队头或队尾,所以传Queue结构体指针

//入队
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	//创建新节点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)//判断申请空间成功
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	//队为空的情况
	if (pq->tail == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	//通常情况(尾插)
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	//队列长度+1
	pq->size++;
}

3.4出队

出队操作就是单链表的头删,这里首先要断言队列为空的情况,队空不能出队,再就是最后一个元素出队时我们直接释放掉队头指针并将队头指针和队尾指针都置空(避免野指针),通常情况先记录队头指针,再将队头指针指向其下一个成为新的队头指针,最后释放掉记录的原队头指针即可,同时队长-1

//出队
void QueuePop(Queue* pq)
{
	assert(pq);
	//断言队列为空
	assert(!QueueEmpty(pq));
	//最后一个元素出队
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	//通常情况(头删)
	else
	{
		QNode* del = pq->head;
		pq->head = pq->head->next;
		free(del);
		//del = NULL; 局部变量没必要置空
	}
	//队长-1
	pq->size--;
}

3.5查看队头元素

首先需要断言队列为空的情况,为空无队头元素,然后直接返回队头结点指向的数值域即可

//查看队头元素
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	//返回队头结点指向的数值域
	return pq->head->data;
}

3.6查看队尾元素

首先也需要断言队列为空的情况,为空无队尾元素,然后直接返回队尾结点指向的数值域即可

//查看队尾元素
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	//返回队尾结点指向的数值域
	return pq->tail->data;
}

3.7统计队列数据个数

这里size就是队列内的有效数据个数,我们直接将其返回即可

//统计队列数据个数
int QueueSize(Queue* pq)
{
	assert(pq);
	//返回size即可
	return pq->size;
}

3.8销毁队列

队列的销毁类似单链表,从队头结点开始循环依次销毁所有节点即可,这里我们也是先记录遍历指针的位置,然后将遍历指针移动到下一个结点,最后释放掉先前记录的节点,最后将队头指针和队尾指针都置空(防止野指针),再将size置零就完成了

//销毁队列
void QueueDestroy(Queue* pq)
{
	assert(pq);
	//从队头开始遍历销毁
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* del = cur;
		cur = cur->next;
		free(del);
	}
	pq->head = pq->tail = NULL;//置空
	pq->size = 0;//置零
}

队列的实现到这里就介绍结束了,期待大佬们的三连!你们的支持是我最大的动力!
文章有写的不足或是错误的地方,欢迎评论或私信指出,我会在第一时间改正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jQuery插件【validate】国际化校验插件

jQuery插件系列 相信大家在网站上都遇到过这种注册的情况吧,有的时候我们什么也不输入点登录或者注册或者鼠标失去焦点的时候,就会自动提示xxx为空,密码不正确,请输入xxx等一系列的提示信息。 那么这是怎么实现的呢,其…

【LeetCode】No.101. Symmetric Tree -- Java Version

题目链接:https://leetcode.com/problems/symmetric-tree/ 1. 题目介绍(Symmetric Tree) Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). 【Translate】: 给定…

QT实战项目1——无边框窗口拖拽和阴影

课时2 开发环境,无边框窗口拖拽和阴影_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV14t411b7EL?p2&vd_source0471cde1c644648fafd07b54e303c905 目录 一、设置无边框 和 鼠标可以拖动窗口 1.1 设置无边框 1.2 鼠标拖动 1.3 展示阴影 一、设置无边框 和 鼠标可…

设计模式-组合模式

组合模式一、学校院系展示需求二、传统方案解决学校院系展示三、组合模式基本介绍四、组合模式原理类图五、组合模式解决的问题六、使用组合模式解决院校展示问题6.1、类图6.2、代码一、学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在…

SQL练习题

新建数据表 首先建立测试数据库的表,新建数据库的sql语句如下,大家可以粘贴成一个sql文件,然后新建所有的表并插入所有的数据: 新建数据库sql文件: DROP TABLE IF EXISTS EMP; DROP TABLE IF EXISTS DEPT; DROP TAB…

Unity UI锚点和位置关系

一、Anchors锚点 Anchors的设置会直接改变RectTransform中它的位置信息;Anchors设置中的X 改变会影响(PosX和Width)或(left和right) 1、Anchors改变位置信息 下图中X锚点的Min和Max值相同时,上面的一栏中…

Java调用命令行并返回打印的内容

博主在最近的工作中,收到了这样一个需求。 调用别人以前完成开发的 jar 包或 python 程序,并将原程序在命令行中输出的内容封装为 JSON 对象后通过 RESTFul 接口返回。 面对以上的需求,博主给出了以下解决方案。话不多说,上代码。…

Mathematica for Linux v13.1.0 科学计算软件多语言版

Wolfram Mathematica for Linux 中文正式版是一款强大的数学计算科学计算软件,MathWorks MATLAB 和 Wolfram Mathematica 、Maplesoft Maple 并称为三大数学软件,Wolfram Mathematica 中文正式版主要用于符号计算软件,也称为计算机代数系统&a…

MySQL如何恢复不小心误删的数据记录(binlog)

前言 题主于今天(2022年11月27日) 在线上环境误操作删除了记录,且没有备份数据,通宵排查事故原因,终于没有酿成生产事故。谨以此文记录。 参考资料 https://blog.csdn.net/qq_23543983/article/details/127298578 …

单源最短路径问题(Java)

单源最短路径问题(Java) 文章目录单源最短路径问题(Java)1、问题描述2、算法思路3、代码实现4、算法正确性和计算复杂性4.1 贪心选择性质4.2 最优子结构性质4.3 计算复杂性5、参考资料1、问题描述 给定带权有向图G(V,E),其中每条…

分布式电源接入对配电网的影响matlab程序(IEEE9节点系统算例)

分布式电源接入对配电网的影响matlab程序(IEEE9节点系统算例) 摘 要:分布式电源的接入使得配电系统从放射状无源网络变为分布有中小型电源的有源网络。带来了使单向流动的电流方向具有了不确定性等等问题,使得配电系统的控制和管…

Android反编译apk

文章目录安装Android Studio1. 解压apk文件方法一:使用apktool反编译(得到的是.smali文件和可直接读的资源文件,如果要得到.dex文件,还要看方法二)方法二:使用解压工具解压(得到的是.dex文件和二…

SpringBoot项目集成Dubbo

1.环境搭建 为整合Dubbo之前,我们所写的项目都是单一应用架构,只需要一个应用,将所有功能都部署在一起,在应用内部是控制层调用业务层,业务层调用数据持久层;如今,整合Dubbo后,我们…

独立产品灵感周刊 DecoHack #039 - 制作自己的音乐墙

本周刊记录有趣好玩的独立产品设计开发相关内容,每周发布,往期内容同样精彩,感兴趣的伙伴可以点击订阅我的周刊。为保证每期都能收到,建议邮件订阅。欢迎通过 Twitter 私信推荐或投稿。自荐产品 1. planet-tab - 由独立开发者 ha…

【云原生】Docker的私有仓库部署——Harbor

内容预知 1.Docker原生私有仓库—— Registry 1.1 Registry的简单了解 1.2 Registry的部署过程 步骤一:拉取相关的镜像 步骤二:进行 Registry的相关yml文件配置(docker-compose) 步骤三:镜像的推送 2. Registry的…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.6 拦截器开发

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.6 拦截器开发2.6.1 拦截器开发2.6.2 小结2 自定义starter …

2022年11月27日学习 SVM

SVM,英文全称为 Support Vector Machine,中文名为支持向量机 ​ SVM也是一种分类算法,它的核心思想用我自己的话来讲就是先找到两个类别中距离最近的几个点作为支持向量,然后计算超平面,超平面需要间隔最大化。然后用超…

【Hack The Box】linux练习-- Previse

HTB 学习笔记 【Hack The Box】linux练习-- Previse 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 &#x1f…

Microsoft SQL Server中的错误配置

介绍 这篇文章将介绍如何利用Microsoft SQL Server中的错误配置,尝试获取反向shell并熟悉Impacket工具的使用,以便进一步攻击某些服务。 impacket的安装地址:https://github.com/SecureAuthCorp/impacket Impacket是用于处理网络协议的Pyt…

FPGA学习-vivado软件的使用

FPGA学习-vivado软件的使用1.杂谈2. vivado新建工程1.杂谈 又被封了7天。 正好封控前领导让我改下fpga代码,趁这个机会好好学习下,虽然在这块一片空白,但是毕竟这块是我的短板,一个不会写代码的硬件工程师是一个不完整的硬件工程…