数据结构—队列

news2024/9/22 15:35:38

队列

  • 队列的概念及结构
  • 队列的实现

队列的概念及结构

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

入队列:进行插入操作的一端称为队尾。

出队列:进行删除操作的一端称为队头。

在这里插入图片描述

注:对于栈而言一种入栈顺序对应多种中出栈顺序;而对于队列而言一种入队顺序对应一种中出队顺序

队列的典型应用:

  • 队列实际中要保证公平排队的地方都可以用队列
  • 广度优先遍历

队列的实现

队列也可以数组和链表的结构实现,使用链表(单链表)的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

在这里插入图片描述

队列的定义

  • 使用链表实现队列,一般写链式结构都要定义节点,因为链表它的结构上是一个一个的节点通过指针连接起来的。
  • 使用单链表实现队列时,都会定义头指针以便找到链表中的所有节点,但是实现队列的出队列和入队列操作时就会导致头指针的改变,这时可以用二级指针传参 (传指针,解引用改变)、一级指针做返回值(接收返回值改变)(应用场景不是频繁调用的)、用带有哨兵位的头节点(不改变)这些方式保存“新的”头指针。此时要实现队列的入队列操作时使用单链表进行尾插时间效率太低了O(N),这时就会用尾指针来标记尾部节点便于尾插(尾插一个节点就更新尾指针即可)时间效率为O(1),这时实现队列就会用到两个指针一个是头指针一个是尾指针(凡是有两个指针的这种设计就会在定义一个结构体把它们包到一起),这时就会用到第四种方式利用结构体包一起 (结构体指针)来避免当前的头指针指向的不是头节点。
  • 单链表的实现之所以不用结构体包一起方式设计,单链表这样设计是没有价值的,单链表设计时只留一个头指针指向它,而尾插时得去找尾,单链表就算有一个尾指针它能解决尾插的问题但是不能解决尾删的问题,干脆不给尾指针了反正尾插尾删效率低。
typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType data;
}QueueNode;

typedef struct Queue
{
	QueueNode* phead;
	QueueNode* ptail;
}Queue;

队列的初始化

队列的初始化只需将结构体内的两个指针置成空即可。

void QueueInit(Queue* pq)
{
	assert(pq);

	pq->phead = pq->ptail = NULL;
}

队列的销毁

队列的销毁需要将队列中的所有数据都删除。运用循环的方式将所有节点进行释放并将队列中的头尾指针置空即可。

void QueueDestory(Queue* pq)
{
	assert(pq);

	QueueNode* cur = pq->phead;
	while (cur)
	{
		QueueNode* next = cur->next;
		free(cur);

		cur = next;
	}

	pq->phead = pq->ptail = NULL;
}

队列的入队列

入队列操作首先创建新节点,其次要判断队列中的两个成员是否为NULL,如果为NULL需要将新节点的地址直接赋值过去即可。否则将新节点直接入队列,更新队列中的尾指针即可。

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;

	if (pq->ptail == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
}

队列的出队列

出队列操作首先保存头节点的下一个节点,然后删除头节点,最后将头指针指向头节点的下一个节点即可。但是需要注意如果头节点的next指向的是NULL,那么释放头节点然后将头指针和尾指针置空即可(这样做可以避免尾指针出现野指针问题)。

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	if (pq->phead->next == NULL)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else
	{
		QueueNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
}

获取队列中的数据个数

队列中的数据个数通过循环遍历的方式获取。但是注意如果这个接口函数偶尔调用可以用这样的方式实现,如果经常调用这个函数就需要在队列结构体中在添加一个成员size(用来记录数据个数,入队列和出队列的函数都得对size进行操作),这样效率更高。

int QueueSize(Queue* pq)
{
	assert(pq);

	// 如果频繁调用这个接口函数(给别人用的,跟别人对接的),可以在Queue中给一个size记录数据个数
	int n = 0;
	QueueNode* cur = pq->phead;
	while (cur)
	{
		n++;
		cur = cur->next;
	}

	return n;
}

队列的队头

队头数据通过头节点来获取数据。

QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->phead->data;
}

队列的队尾

队尾数据通过尾节点来获取数据。

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->ptail->data;
}

队列的判空

队列的判空只需判断队列中尾指针和头指针是否为空即可。

bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->ptail == NULL && pq->phead == NULL;
}

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

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

相关文章

Day8 智慧商城

项目演示 项目收获 创建项目 调整初始化目录 1.删components里的所有文件 2.删views里的所有文件 3.router/index.js 删路由 删规则 import Vue from vue import VueRouter from vue-routerVue.use(VueRouter)const router new VueRouter({routes: [] })export default route…

软件开发合同范本word文档,《某公司软件开发合同》,15页范本供参考

上一篇介绍了软件生命周期全过程,软件工程全周期全过程20项文档模板,附下载。从《合同》到《需求规格说明书》到软件设计、开发、实施、验收、维护等全过程相关文档模板。有朋友反馈附件内容没有补全,本次及后续会用实际案例补全附件内容&…

Backblaze 2023 Q2 硬盘故障质量报告解读

Backblaze 在其博客上发布了 2023 年第二季度的存储设备统计数据。这些数据包括了 Backblaze 在该季度所拥有的存储设备的数量、故障率和更换率等信息,这些信息对于了解存储设备的可靠性和性能非常有用。 在最新的Backblaze硬盘使用统计报告中,我们看到了…

OLED透明屏介绍:领先科技的革命性创新

OLED透明屏作为一项领先的科技创新,在产品设计和用户体验方面展现出了巨大的潜力。 在这篇文章中,尼伽将介绍OLED透明屏的定义、特点、应用领域以及未来发展趋势,以帮助您全面了解OLED透明屏。 一、OLED透明屏的定义与原理 1.1 定义&#x…

概念解析 | 走进射线管积分:探索数学与现实世界的神秘桥梁

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:射线管积分。 走进射线管积分:探索数学与现实世界的神秘桥梁 射线管积分雷达成像 射线管积分(Ray Tube Integration&a…

leetcode 188. 买卖股票的最佳时机 IV

2023.8.21 这道题是 买卖股票的最佳时机III 的升级版&#xff0c;即买卖次数限制为k次&#xff0c;做法和上一篇如法炮制&#xff0c;直接看代码&#xff1a; class Solution { public:int maxProfit(int k, vector<int>& prices) {vector<vector<int>>…

Django模板语法,带你快速入门

目录 案例一&#xff1a;登录页面 案例二&#xff1a;for案例 if案例——单个字符串的传递&#xff0c;列表的传递&#xff0c;字典的传递 模板语法其本质&#xff1a;本质上&#xff0c;Django的模板语法就是在html中&#xff0c;写一些占位符&#xff0c;由数据对这些占位符…

6.824 lab2 raft实现

目录 1 难点及完成思路&#xff1a; 1.1 难点分析&#xff1a; 1.2 完成思路&#xff1a; 1.3 实验心得&#xff1a; 1.4 报告结构&#xff1a; 2 Leader选举模块 2.1 思路概括&#xff08;代码角度&#xff09; 2.2 注意问题&#xff1a; 2.3 代码细节&#…

[WMCTF 2023] crypto

似乎退步不了&#xff0c;这个比赛基本不会了&#xff0c;就作了两个简单题。 SIGNIN 第1个是签到题 from Crypto.Util.number import * from random import randrange from secret import flagdef pr(msg):print(msg)pr(br"""........ …

WMS仓库管理系统选择指南:如何确保您的仓库提高效率?

如何选择WMS仓库管理系统&#xff1f;仓库管理主要包括以下四个方面&#xff1a; 1.商品出入库管理 2.库存调拨 3.库存盘点 4.虚拟库存/实际库存管理 为了更好地管理仓库&#xff0c;我们需要确保基本的硬件设施得以满足&#xff0c;例如划分存储区域、使用货架以及进行员工培训…

Vivado2018.3版本_编译下载打包固化程序

Vivado2018.3版本_编译下载打包固化程序 概述&#xff1a; 在Vivado中开发导出硬件平台&#xff0c;然后在SDK中进行C语言的开发工作&#xff0c;然后把SDK编译生成的.elf文件加入Vivado工程中&#xff0c;编译生成.bit文件&#xff0c;转换成.mas文件&#xff0c;就可以固化到…

使用kubeadm工具升级kubernetes

一、背景&#xff1a; kubeadm部署的kubernetes集群进行升级&#xff0c;通常先升级控制节点&#xff0c;控制节点升级完成后再升级工作节点&#xff0c;本博文只升级了控制节点&#xff0c;工作节点按照相同的流程进行升级即可 环境说明&#xff1a; 主机名节点11.0.1.200k8s…

机器学习笔记之优化算法(十五)Baillon Haddad Theorem简单认识

机器学习笔记之优化算法——Baillon Haddad Theorem简单认识 引言 Baillon Haddad Theorem \text{Baillon Haddad Theorem} Baillon Haddad Theorem简单认识证明过程证明&#xff1a;条件 1 ⇒ 1 \Rightarrow 1⇒ 条件 2 2 2证明&#xff1a;条件 3 ⇒ 3 \Rightarrow 3⇒条件 1…

功率放大器的介绍和应用领域有哪些

功率放大器是将输入信号的功率放大到输出端所需水平的一种电子设备。在实际应用中&#xff0c;功率放大器被广泛使用于音频、视频、通讯等领域。下面&#xff0c;安泰电子将详细介绍功率放大器的工作原理、类型以及应用领域。 功率放大器的工作原理是将输入信号的功率放大到输出…

js 简单的页面导航

实现效果&#xff1a; 实现原理&#xff1a; 实现原理是通过创建数组里面包含对应页面的信息&#xff0c;当点击的时候为数组传递一个对象&#xff0c;里面包含要显示的信息。 跳转链接实现原理&#xff1a; 通过创建一个数组&#xff0c;里面包含所有可以跳转的页面链接名称&a…

【3Ds Max】可编辑多边形“边界”层级的简单使用

目录 示例 &#xff08;1&#xff09;挤出 &#xff08;2&#xff09;插入顶点 &#xff08;3&#xff09;切角 &#xff08;4&#xff09;利用所选内容创建图形 &#xff08;5&#xff09;封口 &#xff08;6&#xff09;桥 示例 这里我们首先创建一个长方体&#xff…

3D角色展示

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>3D卡片悬停</title><style>font-face {font-family: "Exoct";src: url("htt…

解决群晖视频信息插件无法同步的问题

今天发现群晖下载的电影和电视剧没办法显示图片和相关信息&#xff0c;开始以为是升级了什么东西导致的&#xff0c;后来发现api.themoviedb.org 这个API接口ping都没法ping通&#xff0c;估计被墙了。好吧&#xff0c;重新登陆群晖修改hosts文件吧。下面一步一步来讲讲如何修改…

Adobe联创去世,没他就没有PDF,乔布斯也因他逆风翻盘

量子位 | 公众号 QbitAI Adobe联合创始人John Warnock去世了&#xff0c;享年82岁。 他是PDF格式的发明人之一&#xff0c;贡献了PDF中的核心技术PostScript—— 如果没有它&#xff0c;打印机就无法打印复杂页面。可以说&#xff0c;Warnock的这项发明&#xff0c;在上世纪…

【C++】STL——set的介绍和使用、set的构造函数、set的迭代器、set的容量和增删查改函数

文章目录 1.set的介绍2.set的使用2.1set的构造函数2.2set的迭代器2.3set的容量函数2.4set的增删查改函数 1.set的介绍 set的介绍 &#xff08;1&#xff09;set是按照一定次序存储元素的容器。 &#xff08;2&#xff09;在set中&#xff0c;元素的value也标识它(value就是key…