【数据结构】队列的实现

news2025/1/16 6:02:11

目录

  • 队列的概念
  • 队列的结构声明
  • 队列的初始化
  • 数据入队
  • 判断队列是否为空
  • 队列出数据
  • 获取队头
  • 获取队尾
  • 获取队列长度
  • 摧毁队列

队列的概念

只允许从一端插入数据,另一端出数据。
队头:出数据的一端叫队头。
队尾:入数据的一端叫队尾。
通俗地说,就是把栈的数据结构栈底给凿开了用来出数据。

入队演示
在这里插入图片描述

出队演示
在这里插入图片描述

队列的结构声明

我们知道队列有队头和队尾,队尾只添数据不删数据,队头只删数据不添数据。所以我们声明的时候可以用2个指针,一个指向队头,一个指向队尾。

typedef int QDataType;

//队列的节点
struct QueueNode
{
	QDataType val;
	QueueNode* next;
};


struct Queue
{
	//一个指针指向头
	QueueNode* head;
	//一个指针指向尾
	QueueNode* tail;
};

队列的初始化

队列初始时是没有值的,也就意味着没有节点,所以我们把它的头节点和尾节点都指向NULL。

//初始化
void QueueInto(Queue* q)
{
	assert(q);
	q->head = NULL;
	q->tail = NULL;
}

数据入队

数据入队,我们只需要让tail 指向 新节点,如果 head是空的话,也就是刚初始化状态,那么让head也指向这个节点。

如果head 和tail为空
在这里插入图片描述

如果不为空
在这里插入图片描述
代码


//创建节点
QueueNode* CreateNode(QDataType x)
{
	QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newNode == NULL)
	{
		printf("malloc faile\n");
		exit(-1);
	}
	newNode->next = NULL;
	newNode->val = x;
	return newNode;
}

//数据入队
void QueuePush(Queue* q, QDataType x)
{
	//断言
	assert(q);

	//创建节点
	QueueNode* newNode = CreateNode(x);
	//如果head NULL
	if (q->head == NULL)
	{
		q->head = newNode;
		q->tail = newNode;
	}
	else
	{
		//尾节点指向新节点
		q->tail->next = newNode;
		//尾节点移动位置
		q->tail = newNode;
	}

}

判断队列是否为空

很简单,如果头节点为空了,那么整个队列自然就为空了。因为是从队头开始出数据,没有数据出了,那就空了。

//判断队列是否为空
bool QueueIsEmpty(Queue* q)
{
	return q->head == NULL;
}

队列出数据

出数据很简单,释放头节点,让头节点指向下一个,因为队列是先进先出,所以头节点是队头,从队头开始出数据。

在这里插入图片描述

代码


//数据出队
void QueuePop(Queue* q)
{
	assert(q);
	//要保证队列里有数据可以删除
	assert(!QueueIsEmpty(q));

	//头删
	QueueNode* next = q->head->next;
	free(q->head);
	q->head = next;
}

获取队头

只要队列不为空,就可以获取到队头,所以断言一下,直接获取队头即可。

//获取队头
QDataType QueueGetFront(Queue* q)
{
	assert(q);
	//要保证队列里有数据
	assert(!QueueIsEmpty(q));
	return q->head->val;
}

获取队尾

和队头一样,直接获取,不过要保证队列有数据

//获取队尾
QDataType QueueGetBack(Queue* q)
{
	assert(q);
	//要保证队列里有数据
	assert(!QueueIsEmpty(q));
	return q->tail->val;
}

在这里插入图片描述

获取队列长度

从头开始找到尾,返回长度即可。

//获取队列长度
size_t QueueGetSize(Queue* q)
{
	assert(q);
	//要保证队列里有数据
	assert(!QueueIsEmpty(q));
	int len = 1;
	QueueNode* head = q->head;
	QueueNode* tail = q -> tail;
	while (head != tail)
	{
		len++;
		head = head->next;
	}
	return len;
}

摧毁队列

直接释放所有节点,指针置为NULL即可

//销毁
void QueueDestroy(Queue* q)
{
	QueueNode* cru = q->head;
	while (cru != NULL)
	{
		//存储下一个位置地址
		QueueNode* next = cru->next;
		free(cru);
		cru = next;
	}	
}

以上代码Git链接

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

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

相关文章

用技术记录世界杯2022

用技术记录世界杯【2022】 文章目录用技术记录世界杯【2022】前言1 项目介绍2 实验复现2.1 关于项目2.2 数据准备2.3 特征工程3 我的感受前言 Hi,我是Ding Jiaxiong,好久不见(bushi,早上才更新了博客), 今天是2022 年12月 8日 2…

未部署ssl证书,您的账号、密码或被窃取!

浏览网页查找信息时,您有没有注意到有些网站的网址是以https://开头的,有些网址是http://开头?有时还会显示一个突出的警告页面,表明网站是“不安全的”可能会窃取您的账号、密码,骗取财产等。 …

Mybatis-Plus的@Version注解:使用updateBatchById方法引发的问题

正常情况下,我们想要的是,当乐观锁不对的时候要一个反馈,例如:版本号不一致,请刷新页面重新获取数据。 在没有Version注解的时候,一般我们会进行显示校验。例如下图: updateById方法使用演示 …

数商云SRM供应商系统售后模块解析 | 助力汽修企业打造高效SRM服务管理体系

随着我国汽车保有量的持续增长,汽车维修行业不断地向社会化方向发展,汽修行业从产品型的行业转变为服务型行业,成为一个社会化的、人才专业型、技术密集型的和相对独立的行业,发展势头迅猛,据统计,我国的汽…

跨主机访问——docker

当你有若干个容器之后,你可能就希望实现容器的跨机部署访问了,比如aspnetcore在一台host上,mysql在另外一个host上,如果要实现这样的功能,需要你 借助docker自带的overlay网络模型了。 一: overlay网络模型 要想快速的搭建overlay网络,你可以通过docker默认的swarm集群…

代码随想录Day45|70.爬楼梯(进阶)、322.零钱兑换、279.完全平方数

文章目录70.爬楼梯(进阶)322.零钱兑换279.完全平方数70.爬楼梯(进阶) 文章讲解:代码随想录 (programmercarl.com) 题目链接:programmercarl 题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼…

【C#基础学习】第十六章、枚举

目录 枚举 1.枚举的补充 1.1底层类型 1.2 设置显式值 1.3 枚举成员赋值顺序 2.位标志 2.1 Flags特性 枚举 枚举的定义: 枚举是由程序员自定义的值类型。它只有一种类型成员:命名的整数值常量。枚举成员都有一个底层类型的常量值。第一个枚举成员的…

【场景削减】拉丁超立方抽样方法场景削减(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Linux搭建RabbitMQ集群环境

文章目录环境说明Erlang安装下载安装包安装验证RabbitMQ安装下载安装包安装启动RabbitMQ设置开机自动启动安装管理界面创建用户登录管理界面集群配置前提条件构建erlang集群高可用镜像集群配置环境说明 操作系统:CentOS7Erlang版本:21.3RabbitMQ版本&am…

信而泰耦合测试-网络测试仪实操

一、耦合测试原理 1.产生背景​ 常用测试无线设备过程中,将无线设备置于屏蔽箱中,通过无线网卡连接并运行iperf等类似软件的方式检测所述无线设备的吞吐量。 相关技术中将所述无线设备置于所述屏蔽箱中的检测方法,由于所述屏蔽箱存在信号反…

【C语言】字符串函数(二)

目录 一、strncpy函数(字符串拷贝) 1、strncpy函数的用途 2、strncpy函数的使用 二、strncat函数(字符串追加) 1、strncat函数的用途 2、strncat函数的使用 三、strncmp函数(两个字符串比较) 1、strncmp函数的用途 2、strncmp函数的使用 四、strstr函数(查找字符串) 1、strstr函…

2022年底总结(被阿里捞的第1、2、3...次)

前言 自从去年因为个人原因没有去阿里淘系,后面有几次阿里同学问我有没有意向去阿里上班。其实我内心是很激动的,在人才库能被捞也是别人的认可,这个是值得骄傲的,然后需要继续保持自己专研技术的精神以及不断进步的意识。 当然博…

ChatGPT 大智近妖,从宇宙人生到手搓光刻机,从哄女友到写年终总结我们聊得非常开心,反而让人越来越忧心

文章目录宇宙人生问:你觉得人生的意义是什么?问:你觉得思维意识到底是什么问:我之前的两个问题大概有多少人问过你?问:宇宙的边界在哪里?手搓狠活怎么实现量子计算怎么制造一个光刻机怎么制作核…

多谐振荡器

三个非门首尾相接形成环,在理想情况下,无法形成振荡 门一定是存在传输延迟时间的,所以当高电平变成低电平的时候,必然会经过传输延迟时间 所以当反过来发生翻转的时候,经过了三倍的状态延迟时间 震荡的周期是六个传输…

基于SARIMA、XGBoost和CNN-LSTM的时间序列预测对比

利用统计测试和机器学习分析和预测太阳能发电的性能测试和对比 本文将讨论通过使用假设测试、特征工程、时间序列建模方法等从数据集中获得有形价值的技术。我还将解决不同时间序列模型的数据泄漏和数据准备等问题,并且对常见的三种时间序列预测进行对比测试。 介…

RNSScreenStackHeaderConfig“ was not found in the UIManager.解决办法!!亲测有效

Invariant Violation: requireNativeComponent: "RNSScreenStackHeaderConfig" was not found in the UIManager. 原因:RN项目中,开发服务器端已经使用npm i下载了某个模块,但是只有服务器端有,该模块并没有打包安装到手…

Cache与MMU的爱恨纠缠

首先声明本文不准备详细地介绍Cache和MMU的概念和用法,主要是为了厘清两者之间的相互关系和依赖。 1. MMU管理cache访问属性 在没有MMU的时候,cache本身的模型比较简单,如下所示,在使用的时候重点关注Cache数据的一致性问题。 …

linux高可用小知识点汇总-行云管家

不少运维小伙伴对于linux高可用相关知识不是很了解,今天我们小编就给大家汇总了一些,希望可以加深大家的了解。仅供参考哦! linux高可用小知识点汇总-行云管家 一、Linux是什么系统? 【回答】:Linux全称GNU/Linux&am…

小蓝本 第一本《因式分解技巧》 第二章 应用公式 笔记(第二天)

小蓝本 第一本《因式分解技巧》 第二章 应用公式 笔记(第二天)前言二代——应用公式常见公式公式场景公式分类基本间接推导公式(9)、(10)的推导问题分解方法方法1方法2公式推导总结:对照思想小技巧与注意事项习题2题目题解经验前言 第二天op…

基于贝叶斯网络的考虑不确定性的短期电能负荷预测(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…