【数据结构】【版本1.4】【线性时代】——队列

news2024/11/19 11:25:51



快乐的流畅:个人主页


个人专栏:《算法神殿》《数据结构世界》《进击的C++》

远方有一堆篝火,在为久候之人燃烧!

文章目录

  • 引言
  • 一、队列的概念
  • 二、队列的模拟实现
    • 2.1 定义
    • 2.2 初始化
    • 2.3 销毁
    • 2.4 入队
    • 2.5 判空
    • 2.6 出队
    • 2.7 获取队头元素
    • 2.8 获取队尾元素
    • 2.9 获取队列的元素个数
    • 2.10 元素访问
  • 三、队列的应用场景

引言

数据结构世界——队列(Queue)

一、队列的概念

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

入队:队列的插入操作叫做入队。进行插入操作的一端称为队尾
出队:队列的删除操作叫做出队。进行删除操作的一端称为队头

二、队列的模拟实现

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

2.1 定义

typedef int QDataType;
typedef struct QueueNode
{
	QDataType data;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;
  • 定义两个结构体,一个代表节点的信息,另一个代表队列的信息
  • 因为队列的特性要在一端入,另一端出,所以要记录头尾指针(要不然找尾效率太低了)
  • 而size代表当前队列元素个数(可加可不加,加上更好)

2.2 初始化

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

	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}
  • 头尾指针置为NULL,size置为0

2.3 销毁

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

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

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
  • 创建cur变量,循环释放每一个节点,直到cur为空
  • 最后再将头尾指针置为NULL,size置为0

2.4 入队

void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;

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

	pq->size++;
}
  • 先创建新节点,用malloc函数动态开辟节点空间,再将数据放入新节点中,初始地址为NULL(因为这里只有入队用到生成新节点,所以不用抽离成函数)
  • 再要分空链表和非空链表进行讨论,空链表判断时,加入assert断言,防止外部操作错误,造成头指针不为空,尾指针为空
  • 链表为空时,则头尾指针都指向新节点;链表不为空时,则正常尾插

2.5 判空

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}
  • 如果size为0,则队列为空,返回真;反之,则不为空,返回假

2.6 出队

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

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

	pq->size--;
}
  • 先判断队列是否为空(保证phead不为NULL,防止为空指针的解引用)
  • 再分单个节点和多个节点来讨论:单个节点,则释放头指针指向的节点后,头尾指针置为NULL;多个节点,则正常头删

2.7 获取队头元素

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

	return pq->phead->data;
}
  • 获取头指针节点的数据

2.8 获取队尾元素

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

	return pq->ptail->data;
}
  • 获取尾指针节点的数据

2.9 获取队列的元素个数

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

	return pq->size;
}

这里很多函数实现都很简单,有些操作直接外部对结构体都可以直接实现,但最后还是写成函数封装,防止别人使用时对该数据结构不够熟悉,导致使用错误。

2.10 元素访问

队列中元素访问(打印),不是用函数实现。因为它的特殊结构,决定了它的元素不能从任意位置访问 ,必须符合先进先出原则才可以。

void TestQueue1()
{
	Queue q;
	//初始化
	QueueInit(&q);
	//入队
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	//打印
	while (!QueueEmpty(&q))
	{
		printf("%d ", QueueFront(&q));
		QueuePop(&q);
	}
	//销毁
	QueueDestroy(&q);
}
  • 通常用循环的方式进行访问,同时每访问一个元素,就将它弹出队列,再进行下一个元素的访问

三、队列的应用场景

  1. 任务调度
    在操作系统中,任务调度是一个重要的功能。当多个任务需要等待执行时,可以将它们按照到达的顺序放入队列中,然后由调度器按照队列的顺序依次执行这些任务。

  2. 打印作业
    在打印机中,当有多个打印作业需要等待处理时,可以将它们放入队列中。打印机按照队列的顺序依次处理这些作业,确保先到达的作业先被打印出来。

  3. 网络数据包处理
    在网络通信中,数据包的处理通常也是按照队列的方式进行的。当网络设备接收到数据包时,将它们放入接收队列中;当设备需要发送数据包时,从发送队列中取出数据包进行发送。这种方式保证了数据包的顺序性和高效性。


真诚点赞,手有余香

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

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

相关文章

ImportError: No module named createrepo

我在用createrepo命令创建本地源时,出现如下: ImportError: No module named createrepo原因估计就是之前升级python2.6为2.7时导致(系统为centos7),看网上很多说, 修改/usr/share/createrepo/genpkgmeta…

7.系统工具——黑马程序员Java最新AI+若依框架项目

目录 前言一、表单构建任务:设计添加课程表单 二、 代码生成1.任务:将部门表在页面端显示改为树形结构 三、系统接口任务:使用sagger进行接口测试 前言 提示:本篇讲解若依框架 系统工具 一、表单构建 功能:完成前端…

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式,用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性,可以处理各种HTTP请求,并支持各种数据格式,如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(Ac…

关于最强模型Claude 3.5 Sonnet,你需要知道的10条总结!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识,包括但不限于AI科普,AI工具测评,AI效率提升,AI行业洞察。关注我,AI之…

VMware Workstation克隆虚拟机详细步骤

克隆虚拟机 首先我们先创建一台虚拟机,将该虚拟机关闭后,然后右键该虚拟机按照图下所示点击 克隆 下一页 下一页 这里按照需求选择克隆类型,我选择创建完整克隆。点击下一步 设置好虚拟机名称和位置,点击完成 稍微等待一会 点击 …

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Prez于…

.NET 通过UserInit键实现Windows权限维持

01阅读须知 此文所节选自小报童《.NET 内网实战攻防》专栏,主要内容有.NET在各个内网渗透阶段与Windows系统交互的方式和技巧,对内网和后渗透感兴趣的朋友们可以订阅该电子报刊,解锁更多的报刊内容。 02基本介绍 本文内容部分节选自小报童…

C++项目——负载均衡在线OJ

目录 前言 一、所用技术与开发环境 二、项目宏观结构 三、日志服务设计 四、compiler 编译服务设计 1.编译服务 2.运行服务 3.编译并运行服务 4.引入cpp-httplib库 4.1升级gcc版本 4.2cpp-httplib 4.3httplib的使用 五、oj_server服务设计 1. http路由选择 2.文…

预测准确率达95.7%,ChatMOF利用LLM预测和生成金属有机框架,包含人工智能词汇表(AI glossary)

预测准确率达95.7%,ChatMOF利用LLM预测和生成金属有机框架,包含人工智能词汇表(AI glossary)。 金属有机框架(MOF)因其孔隙率大、表面积大和出色的可调性而用于许多化学应用。然而,在利用 AI 深入探索 MOF 设计与性能优化的研究征途中,科学家们正面临着前所未有的挑战。…

2024中国第三方算力中心服务商发展研究报告

来源:科智咨询 近期历史回顾:《江苏省绿色建筑评价标识实施细则》(1).pdf 《江苏省绿色建筑评价标识实施细则》.pdf 【计算工具】钢铁企业碳排放各工序数据收集表.xlsx 【深度报告】钢铁产品碳足迹核算及报告指南.pdf 【专家PPT】宝钢低碳钢铁技术策划及…

Win10用户必看:最好用最稳定的版本在此,值得一试!

在Win10电脑操作中,用户可以根据的需要,下载安装不同的系统版本。现在,许多用户好奇Win10哪个版本最好用最稳定?接下来小编给大家推荐最好用最稳定的Win10版本,这些系统版本经过优化升级,相信会给大家带来最…

Win11最适合打游戏的版本推荐:畅玩游戏,告别卡顿!

在Win11电脑操作中,用户不仅可以进行办公、学习等操作,也可以畅玩喜欢的游戏。如果喜欢打游戏的用户,就可以安装上适合打游戏的系统版本。但许多新手用户不知道去哪里找到最适合打游戏的Win11系统版本?以下小编就给大家带来这样的…

视频集市新增支持多格式流媒体拉流预览

流媒体除了常用实时流外还有大部分是以文件的形式存在,做融合预览必须要考虑多种兼容性能力,借用现有的ffmpeg生态可以迅速实现多种格式的支持,现在我们将按需拉流预览功能进行了拓展,正式支持了ffmpeg的功能,可快捷方…

7个高效的TypeScript工具类型,你会用了吗?

在现代Web开发中,TypeScript几乎已经成为默认技术。TypeScript本身就提供了描述代码的方法,但工具类型(Utility Types)就像给你代码加上了“超能力”! 这些工具类型能让你的代码更清晰、更简洁,同时还能减少…

20240623(26.0) 重要财经新闻

财经关注 ► 券商中国:北交所于6月21日晚间受理了3家企业的IPO申请。6月20日晚间,沪深交易所各受理了1家IPO申请。这也意味着,三大交易所IPO受理全部恢复。与此同时,三大交易所IPO上市委会议也已经全部重启。 ► 全球多地近期遭遇…

【C++】Cmake入门|掌握cmake的基本操作

前言: CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用&am…

vue3import的插件全局引入

webpack 的引入 npm install -D unplugin-auto-import const AutoImport require(unplugin-auto-import/webpack).default;configureWebpack: {devtool: source-map,module: {rules: [{test: /\.mjs$/,include: /node_modules/,type: javascript/auto}],}, plugins: [Aut…

建材租赁管理系统软件教程,操作简单佳易王租赁管理系统操作教程

建材租赁管理系统软件教程,操作简单佳易王租赁管理系统操作教程 一、软件操作教程 以下软件操作教程以,佳易王租赁管理系统为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 租赁登记: a、租赁登记可以记录日…

Codeforces Round 954 (Div. 3) A B C D

A. X Axis time limit per test: 2 second memory limit per test: 256 megabytes input: standard input output: standard output You are given three points with integer coordinates x 1 x_1 x1​, x 2 x_2 x2​, and x 3 x_3 x3​ on the X X X axis ( 1 ≤ x i ≤ …

ROS2从入门到精通4-4:局部控制插件开发案例(以PID算法为例)

目录 0 专栏介绍1 控制插件编写模板1.1 构造控制插件类1.2 注册并导出插件1.3 编译与使用插件 2 基于PID的路径跟踪原理3 控制插件开发案例(PID算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和…