队列的实现---超详细

队列的实现—超详细

在这里插入图片描述

文章目录

  • 队列的实现---超详细
    • 一、队列的模型
    • 二、代码实现以及测试用例
      • ①队列初始化
      • ②入队
      • ③出队
      • ④输出队头
      • ⑤输出队尾
      • ⑥判断队列是否为空
      • ⑦队列的长度
      • ⑧队列的销毁
      • ⑨测试用例

一、队列的模型

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。
在这里插入图片描述
所以我们可以思考一下,这种结构如果用顺序表来实现一定是十分麻烦的,因为顺序表的头删的时间复杂度是O(N)。所以我们应该要采取链表来实现队列结构。
至于是单链表还是带头双向循环链表,其实都是无伤大雅的,在这里我们选择单链表。
结构:

typedef int SDataType;

typedef struct Queue
{
	struct Queue* next;
	SDataType val;
}QU;

其实这样我们已经把单链表构建出来了,但是请大家思考两个问题:
如果是入队时,难道我每次入队都需要去找一次尾吗?
如果是计算队列长度时,这是一个不在连续空间存储的数据结构,我们如果简单的计算出长度呢?

所以我们可以再次引入一个结构体,将这个链表的头、尾和长度都计算出来。

typedef struct queue
{
	QU* phead;
	QU* tail;
	int size;
}q;

二、代码实现以及测试用例

①队列初始化

void QIni(q* p)
{
	assert(p);
	p->phead = p->tail = NULL;
	p->size = 0;
}

②入队

void QPush(q* p, QDataType x)
{
	assert(p);
	QU* newnode = (QU*)malloc(sizeof(QU));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(-1);
	}
	newnode->next = NULL;
	newnode->val = x;
	if (p->tail == NULL)
	{
		p->phead = p->tail = newnode;
	}
	else
	{
		p->tail->next = newnode;
		p->tail = newnode;
	}
	p->size++;
}

③出队

void QPop(q* p)
{
	assert(p);
	assert(p->phead);
	QU* tmp = p->phead->next;
	free(p->phead);
	p->phead = tmp;
	if (p->phead == NULL)
	{
		p->tail = NULL;//很关键
	}
	p->size--;
}

④输出队头

QDataType QFront(q* p)
{
	assert(p);
	assert(p->phead);
	return p->phead->val;
}

⑤输出队尾

QDataType QBack(q* p)
{
	assert(p);
	assert(p->tail);
	return p->tail->val;
}

⑥判断队列是否为空

bool QEmpty(q* p)
{
	assert(p);
	return p->phead == NULL;
}

⑦队列的长度

int QSize(q* p)
{
	assert(p);
	return p->size;
}

⑧队列的销毁

void QDestroy(q* p)
{
	assert(p);
	//assert(p->phead);
	QU* tmp = p->phead;
	while (tmp)
	{
		QU* tmp2 = tmp->next;
		free(tmp);
		tmp = tmp2;
	}
	p->phead = p->tail = NULL;
	p->size = 0;
}

⑨测试用例

void test2()
{
	q p;
	QIni(&p);
	QPush(&p, 1);
	QPush(&p, 2);
	QPush(&p, 3);
	QPush(&p, 4);
	QPush(&p, 5);
	while (!QEmpty(&p))
	{
		printf("%d ", QFront(&p));
		QPop(&p);
	}
	printf("\n");
	QDestroy(&p);
}

int main()
{
	test2();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Semantic Kernel 学习笔记2

本来想白瞟免费Bing Search API如下,但是报错无法链接利用免费的必应 Bing 自定义搜索打造站内全文搜索_bing_subscription_key-CSDN博客 改成按照官方推荐申请,并在.env文件中添加BING_API_KEY""字段。 1. 打开https://www.microsoft.com/en-…

《QT从基础到进阶·二十七》进度条QProgressBar

ui.ProgressBar.setValue(45); //45% ui.ProgressBar.setMin(0); ui.ProgressBar.setMax(255);0到100分为255份,值为215时,进度条为100/255*215 84% 点击主界面弹出进度条QProgressDialog 常用功能: setWindowFlags(Qt::Dialog | Qt::Cu…

基于象群算法优化概率神经网络PNN的分类预测 - 附代码

基于象群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于象群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于象群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

【C语言】自定义类型:结构体、枚举、联合

简单不先于复杂,而是在复杂之后 文章目录 1. 结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 特殊的声明1.4 结构体的自引用1.5 结构体变量的定义和初始化1.6 结构体内存对齐1.7 修改默认对齐数1.8 结构体传参 2. 位段2.1 什么是位段2.2 位段的内存分配2.3 位段的…

解决:java: 错误: 不支持发行版本 5 最有效方法

报错信息如图&#xff1a; 直接上终极方法&#xff1a; 修改配置文件 如图找到settings.xml文件 在标签中间插入如下代码&#xff08;jdk更改为自己电脑上的版本&#xff09; <profile><id>development</id><activation><jdk>11</jdk><…

深入Rust:探索所有权和借用机制

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起深入探索Rust语言中的一个核心概念&#xff1a;所有权和借用机制。 这些特性是Rust区别于其他语言的重要特点&#xff0c;它们在内存管理和并发编程中扮演着关键角色。 一、Rust所有权机制 1. 什么是所有权&#x…

USB复合设备构建CDC+HID鼠标键盘套装

最近需要做一个小工具&#xff0c;要用到USB CDCHID设备。又重新研究了一下USB协议和STM32的USB驱动库&#xff0c;也踩了不少坑&#xff0c;因此把代码修改过程记录一下。 开发环境&#xff1a; ST-LINK v2 STM32H743开发板 PC windows 11 cubeMX v6.9.2 cubeIDE v1.13.2 cub…

Google 向中国开发者开放数百份 TensorFlow 资源

Google 的机器学习框架 TensorFlow 自 2015 年开源后&#xff0c;已然成为 AI 领域最受欢迎的框架。 据统计&#xff0c;在广受欢迎的 Python 编程语言在线软件知识库 PyPi 上&#xff0c;TensorFlow 的下载次数已超过 90 万&#xff0c;其中有 15% 来自中国。谷歌官方博客也表…

11.10~11.15置信区间,均值、方差假设检验,正态,t,卡方,F分布,第一第二类错误

置信度&#xff0c;置信区间 给定一个置信度&#xff0c;就可以算出一个置信区间。 如果给的置信度越大&#xff0c;那么阿尔法就越小 给的置信度越小&#xff0c;那么α就越大&#xff0c;那么 考虑精确性&#xff0c;希望区间长度尽可能小&#xff0c;所以是取正态的中间…

Postman的常规断言/动态参数断言/全局断言

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 断言&#xff0c;包括状态码断言和业务断言&#xff0c;状态码断言有一个&#xff0c;业务断言有多个。 一&#xff09;常规的…

Python数据容器之(元组)

我们前面所了解的列表是可以修改的&#xff0c;但如果想要传递的信息&#xff0c;不被篡改&#xff0c;列表就不合适了。 元组同列表一样&#xff0c;都是可以封装多个、不同类型的元素在内。 但最大的不同点在于&#xff1a; 元组一旦定义完成&#xff0c;就不可修改 所以…

exce常用

一、冻结 同时冻结行和列 打开一个Excel表格&#xff0c;点击选择需要冻结的行和列交接处对应的单元格&#xff08;例如&#xff1a;需要同时冻结1、2行和A、B列&#xff0c;则选中行列交接对应的C3单元格&#xff09;&#xff09;&#xff0c; 即下一行 和下一列的交接点。 …

虹科方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案

来源&#xff1a;雅名特自动驾驶 虹科方案 | 从概念到生产的自动驾驶软件在环&#xff08;SiL&#xff09;测试解决方案 自动驾驶软件在环&#xff08;SiL&#xff09;测试解决方案 自动驾驶软件在环&#xff08;SiL&#xff09;测试解决方案能够研究和验证高历程实验和恶劣驾…

Xocde 升级15 或者 iOS17报错:

错误&#xff1a; Assertion failed: (false && "compact unwind compressed function offset doesnt fit in 24 bits"), function operator(), file Layout.cpp, line 5758. 翻译&#xff1a; 断言失败&#xff1a;&#xff08;false&&“压缩展开…

计算机网络之网络体系结构

计算机网络体系结构 一、常见的计算机体系结构 1.1 OSI标准以及TCP/IP体系结构 OSI标准失败的原因&#xff1a; OSI的专家们缺乏实际经验&#xff0c;他们在完成OSI标准时没有商业驱动力OSI的协议实现起来过分复杂&#xff0c;而且运行效率很低OSI标准的制定周期太长&#x…

Python中sys模块详解:常用方法与变量

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python中sys模块详解&#xff1a;常用方法与变量&#xff0c;文章2500字&#xff0c;阅读大约8分钟&#xff0c;大家enjoy~~ sys 模块是 Python 标准库中的一个核心模块&…

【C语言 | 数组】C语言数组详解(经典,超详细)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

服务名无效。 请键入 NET HELPMSG 2185以获得更多的帮助

遇到的问题是MySQL服务没有。 因为net start 服务名&#xff0c;启动的是win下注册的服务。此时&#xff0c;我系统中并没有注册mysql到服务中。即下面没有mysql服务。 mysqld --install net start mysql

Linux_包管理_apt和apt-get、apt upgrade会自动升级内核

1、apt和apt-get 这篇文章说的很详细&#xff0c;【精选】一文搞清apt与apt-get的异同_apt和aptget-CSDN博客&#xff0c;来自于英语原文&#xff0c;Difference Between apt and apt-get Commands [Explained]。 简单来说&#xff0c;apt更容易使用&#xff08;比如显示下载…

武汉凯迪正大—锂电池均衡维护仪

产品概况 KDZD885C 电池容量平衡测试系统&#xff0c;主要用于锂电池箱充放电测试及均衡维护&#xff0c;解决锂电池包单芯电压不均衡的痛点&#xff0c;用于快速解决锂电池电压不一致的难题,适用于各锂电池模组电压等级&#xff0c;集单芯放电&#xff0c;充电&#xff0c;均…