队列的实现---超详细

news2024/11/26 10:46:39

队列的实现—超详细

在这里插入图片描述

文章目录

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

一、队列的模型

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
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;
}

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

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

相关文章

从零搭建微服务架构:Spring Boot与Nacos完美整合

🎏:你只管努力,剩下的交给时间 🏠 :小破站 从零搭建微服务架构:Spring Boot与Nacos完美整合 前言第一:服务注册与发现第二:配置中心第三:报错问题解决第四:什…

深度学习+opencv+python实现车道线检测 - 自动驾驶 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 &am…

【数据结构】单链表基本操作的实现

【单链表的头插和尾插】//无头结点 #include<stdio.h> #include<stdlib.h> typedef struct LNode {int date;struct LNode *next; }LNode,*LinkList; LinkList great_LinkList(LinkList L)//头部插入 {LinkList s;int x,j1;scanf("%d",&x);while(x…

OPPO Watch纯手机开启远程ADB调试

Wear OS手表中&#xff0c;我们可以直接在开发者设置中打开WiFi调试。但是这在OPPO等魔改Android系统中不再奏效。 需要什么&#xff1f;&#xff1f; 手表一台手机一个OTG转接头一个手表充电器一个 演示设备 手机&#xff1a; OPPO Find X手表&#xff1a; OPPO Watch 1代 …

第十九章绘图

Java绘图类 Graphics 类 Grapics 类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics 类封装了Java 支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 Graphics 类提供了绘图常用的…

Oracle OCP / MySQL OCP认证容易通过吗

诸多学员在首次考OCP时&#xff0c;不清楚要如何选择。在本文中&#xff0c;我会为大家进行讲解&#xff01; 选择OCP认证时需要考虑的几大项目&#xff1a; 授课老师师资经验 课程大纲 试听课程 考试通过率 业界口碑 服务质量 郭一军老师的OCP培训在业界培训的学员中已…

SystemVerilog学习 (6)——验证平台

一、概述 测试平台&#xff08;Testbench&#xff09;是整个验证系统的总称。它包含了验证系统的各个组件、组件之间的互联关系&#xff0c;测试平台的配置与控制等&#xff0c; 从更系统的意义来讲&#xff0c;它还包括编译仿真的流程、结果分析报告和覆盖率检查等。 从狭义上…

【Phoenix】请求的生命周期

本文的目的是讨论Phoenix请求的生命周期。我们实战添加两个新的页面&#xff0c;并讨论整个过程是如何串起来的。 让我们从添加第一个新页面开始。 添加一个新页面 web应用通常通过将HTTP方法和路径映射到应用的某个函数来处理请求。Phoenix通过路由器来实现这个匹配。例如将…

蒙HarmonyOS从零实现类微信app效果第二篇,我的+发现页面实现

本着不拖更的原则&#xff0c;今天上新了&#xff0c;今天实现了类微信app的发现页和我的页面。先看效果。 效果是不是看着还不错。其实这两个页面功能实现还是比较简单的&#xff0c;接下来还是老规矩&#xff0c;先进行页面的拆分和代码实现&#xff0c;然后进行相关我认为比…

嵌入式linux--sysfs文件系统以及操作GPIO

sysfs文件系统 在Linux系统中&#xff0c;/sys路径是一个特殊的虚拟文件系统&#xff08;Virtual File System&#xff09;&#xff0c;用于提供对内核和设备的运行时信息的访问。它是sysfs文件系统的挂载点&#xff0c;提供了一种以文件和目录形式表示系统设备、总线、驱动程…

【Web开发】基于 Jekyll 中的 Chirpy 模板搭建博客网站(一):成功经验篇

基于 Jekyll 中的 Chirpy 模板搭建博客网站&#xff08;一&#xff09;&#xff1a;成功经验篇 1.Jekyll 介绍2.Chirpy 介绍3.安装步骤3.1 Prerequisites3.2 Installation3.2.1 Creating a New Site3.2.2 Installing Dependencies 3.3 Usage3.3.1 Configuration3.3.2 Running L…

使用C#插件Quartz.Net定时执行CMD任务工具2

目录 创建简易控制台定时任务步骤完整程序 创建简易控制台定时任务 创建winform的可以看&#xff1a;https://blog.csdn.net/wayhb/article/details/134279205 步骤 创建控制台程序 使用vs2019新建项目&#xff0c;控制台程序&#xff0c;使用.net4.7.2项目右键&#xff08…

ubuntu下C++调用matplotlibcpp进行画图(超详细)

目录 一、换源 二、安装必要的软件 三、下载matplotlibcpp 四、下载anaconda 1.anaconda下载 2.使用anaconda配置环境 五、下载CLion 1.下载解压CLion 2.替换jbr文件夹 3.安装CLion 4.激活CLion 5.CLion汉化 6.Clion配置 六、使用CLion运行 七、总结 我的环…

posix定时器的使用

POSIX定时器是基于POSIX标准定义的一组函数&#xff0c;用于实现在Linux系统中创建和管理定时器。POSIX定时器提供了一种相对较高的精度&#xff0c;可用于实现毫秒级别的定时功能。 POSIX定时器的主要函数包括&#xff1a; timer_create()&#xff1a;用于创建一个定时器对象…

Kubernetes(k8s)介绍和环境部署

文章目录 Kubernetes一、Kubernetes介绍1.Kubernetes简介2.Kubernetes概念3.Kubernetes功能4.Kubernetes工作原理5.kubernetes组件6.Kubernetes优缺点 二、Kubernetes环境部署环境基本配置1.所有节点安装docker2.所有节点安装kubeadm、kubelet、kubectl添加yum源containerd配置…

LeetCode(16)接雨水【数组/字符串】【困难】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 42. 接雨水 1.题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&…

PbootCMS 应用快速迁移至浪潮信息 KeyarchOS 云服务器

本文我们以 PbootCMS 应用为例&#xff0c;详细介绍如何使用 X2Keyarch 迁移工具将其从 CentOS 系统迁移到浪潮信息 KeyarchOS 系统。 背景介绍 众所周知&#xff0c;CentOS 是最流行的红帽克隆版&#xff0c;因为免费&#xff0c;所以它的安装量甚至比红帽本身要大得多。本来…

Feature Pyramid Networks for Object Detection(2017.4)

文章目录 Abstract1. Introduction3. Feature Pyramid NetworksBottom-up pathwayTop-down pathway and lateral connections 7. Conclusion FPN Abstract 特征金字塔是识别系统中检测不同尺度物体的基本组成部分。但最近的深度学习对象检测器避免了金字塔表示&#xff0c;部分…

python科研绘图:绘制X-bar图

目录 1.X-bar 图的基本概念 2.X-bar 图的绘制过程 3.X-bar 图的优势 4.X-bar 图的绘制 1.X-bar 图的基本概念 X-bar控制图是一种统计工具&#xff0c;用于监控和控制生产过程中的质量变量。它是过程能力分析和统计过程控制&#xff08;SPC&#xff0c;Statistical Process…

微机原理_9

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。 1.当运算结果的最高位为1时&#xff0c;标志位(&#xff09; A. CF1 B. OF1 C. SF1 D. ZF1 2、汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可…