数据结构初阶 队列

一. 队列的基本介绍

1. 基本概念

队列是基本数据结构的一种 它符合先进先出的原则

 我们来看图

 

大概就是这样子的一种情况 

我们想想看 应该用数组还是链表来实现这个结构方便一点呢

我想同学们心里现在肯定已经有了答案了

肯定不是数组

为什么呢?

因为我们如果用数组头作为队头的话 每次删数据就要往前移动很多组其他的数据

这里有同学肯定会有这样子的疑问?

不移动可不可行呢?

当然不可以 !

队列这种数据结构已经规定死了就是头出 尾进

所以说我们使用链表来实现这个数据结构

2. 代码表示

typedef int QDateType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDateType date;
}QNode;
typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;

仔细看

我们这里使用QueueNode来表示储存数据的一个个节点

使用Queue来表示两个指针 头和尾

可以看图理解快一点

二. 接口函数的实现 

1. 队列初始化

//初始化
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

队列初始化实际上就是将队列的两个指针置空

我们来看看效果

这里没有传二级指针进去到底能不能将一级指针置空

成功将两个指针置空了

这是为什么呢?

因为我们的头和尾指针实际上是储存在一个结构体里面的

当我们将结构体的地址传进去的时候 结构体指针能够访问到结构体内部的内容(这两个指针)并且可以修改它们

2. 插入数据

这里插入数据我们要考虑两种情况

1.如果head和tail指针指向NULL,就需要将newnode赋给head和tail指针

2.head和tail不指向NULL,就将newnode的地址赋给tail->next,再将tail移到newnode即可

代码如下:

//队进
void QueuePush(Queue* pq, QDateType x)
{
	assert(pq);
	//开辟新节点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	//赋值
	newnode->next = NULL;
	newnode->date = x;
	//判断是否为空
	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	//个数要++
	pq->size++;
}

 看看效果怎么样

可以运行

3. 删除数据

这里我们要注意的是

由于队列结构的特殊性

我们在打印数据的时候必须要删除数据

所以我们先写删除数据的接口函数

代码表示如下

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->head!=NULL);
	//只有一个节点
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		//保存下一位
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;//迭代
	}
	//个数要--
	pq->size--;
}

看看效果:

可以运行

4. 摧毁队列

直接看代码:

void QueueDestroy(Queue* pq)
{
	assert(pq);
	//两个结构体依次销毁 先销毁QNode
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	//再置空Queue
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

注意:两个结构体要依次销毁,类似(套娃) 

我们来看看效果

5. 判断为空

这个也很简单和栈差不多

这里就直接给代码了

//判断为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}

6.返回大小

这个也很简单,因为我们在Queue结构体中已经定义过size了,我们直接返回就可以

直接看代码:

//大小
int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

7. 返回头数据

这个很简单 返回head的值就可以了

注意断言的使用

//对头
QDateType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->head->date;
}

8.返回尾数据

一样的简单

也要注意断言的使用

//队尾
QDateType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	return pq->tail->date;
}

以上便是本文所有内容了,如有错误请各位大佬不吝赐教,感谢留言

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

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

相关文章

apollo版本更新简要概述

apollo版本更新简要概述 Apollo 里程碑版本9.0重要更新Apollo 开源平台 9.0 的主要新特征如下:基于包管理的 PnC 扩展开发范式基于包管理的感知扩展开发范式全新打造的 Dreamview Plus 开发者工具感知模型全面升级,支持增量训练 版本8.0版本6.0 Apollo 里…

NCNN中的模型量化解决方案:源码阅读和原理解析

前言:去年NCNN发布了模型量化的解决方案,作为目前中国大陆被使用最多的端侧模型推理解决方案,NCNN开源的代码值得认真阅读和研究。这篇博客笔者和大家一起探索NCNN的模型量化部分,希望大家在NCNN的世界里玩得开心。 目录 量化方法…

linux中逻辑卷管理与扩展

逻辑卷管理与扩展 逻辑卷 作用: 1.整合分散的空间2.空间支持扩大 逻辑卷制作过程:将众多的物理卷(PV)组建成卷组(VG),再从卷组中划分出逻辑卷(LV) 逻辑卷的逻辑思路 …

2024年西安交通大学程序设计校赛(ABCDEFO)

题目链接:https://vjudge.net/contest/630537#overview 文章目录 A题题意思路编程 B题题意思路编程 C题题意思路编程 D题题意思路编程 E题题意思路编程 F题题意思路编程 O题题意思路编程 写在前面:今天的训练赛出的题目偏简单,与XCPC的难度差…

【Linux】Linux基本指令2

我们接着上一篇:http://t.csdnimg.cn/bSJx8 我们接着完善ls指令 我们可以直接匹配对应格式的文件匹配出来 1.man指令(重要): Linux的命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助…

降价潮背后:中国产业大模型落地的卡点到底在哪?

“技术是不会以任何商业行为或者人们的意愿所改变它的上限和下限的,它需要的时间是恒定的。 ” 作者|思杭 编辑|皮爷 出品|产业家 如果说中国大模型市场最核心的话题是什么?降价则必然是其中之一。 从目前的参赛玩家来看,不论是字节豆…

在window中使用HTTP服务器获取kali的文件

文章目录 一、在window中使用HTTP服务器获取kali的文件1、疑问2、执行条件3、成功读取 一、在window中使用HTTP服务器获取kali的文件 1、疑问 有时候kali上面有的文件想传入window但是发现不允许这样操作那怎么办呢?特别是在一些限制工具的比赛中想把kali的文件传…

主播们直播时的美颜是如何实现的?集成第三方美颜SDK方案详解

很多人问小编,主播们直播时的美颜效果是如何实现的呢?接下来,我将为您详细介绍美颜功能的实现原理。 一、美颜功能的基本原理 通过对图像进行实时处理,达到美化人脸的效果。其主要技术包括: 1.人脸检测与关键点定位 …

【Python】解决Python报错:SyntaxError: invalid character in identifier

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

vue3和vite实现vue-router4版本路由的配置以及自动生成路由配置

这个是普通的手动路由配置:https://blog.csdn.net/weixin_68658847/article/details/130071101 自动路由配置 创建项目 npm create vitelatest my-vue-app -- --template vue // 或者 yarn create vite my-vue-app --template vue// 安装路由 yarn add vue-route…

备受推崇的公司文件加密文件推荐榜单

迄今为止,加密依然是最有效的用于保护数据、通讯安全的手段之一 在数字化时代,文件加密软件成为了保护个人和企业数据安全的重要工具。随着技术的不断进步,市场上涌现出了众多优秀的文件加密软件。 以下十款文件加密软件因其出色的性能、易…

生成随机数值与二维数组的探索之旅

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、随机数生成的策略 三、实现过程与代码案例 四、注意事项与扩展讨论 一、引言…

系统架构设计师【第2章】: 计算机系统基础知识 (核心总结)

文章目录 2.1 计算机系统概述2.2 计算机硬件2.2.1 计算机硬件组成2.2.2 处理器2.2.3 存储器2.2.4 总线2.2.5 接口2.2.6 外部设备 2.3 计算机软件2.3.1 计算机软件概述2.3.2 操作系统2.3.3 数据库2.3.4 文件系统2.3.5 网络协议2.3.6 中间件2.3.7 软件构件2.3.8 …

【车载开发系列】Autosar DEM中重要配置项说明

【车载开发系列】Autosar DEM中重要配置项目 【车载开发系列】Autosar DEM中重要配置项目说明 【车载开发系列】Autosar DEM中重要配置项目1)DemDtcStatusAvailabilityMask2)DemTypeOfDTCSupported3)DemFreezeFrameCapture4)DemIm…

如何在phpMy管理对Joomla后台的登录密码进行重置

本周有一个客户,购买Hostease的虚拟主机,询问我们的在线客服,如何在phpMy管理对Joomla后台的登录密码进行重置?我们为用户提供相关教程,用户很快解决了遇到的问题。在此,我们分享这个操作教程,希…

给想玩AIGC的小白:教你从0搭一个图文视频生成网站(附插件源码)

Stable Diffusion的发布是AI图像生成发展过程中的一个里程碑,相当于给大众提供了一个可用的高性能模型,让「AI 文本图片生成」变成普通人也能玩转的技术。最近一些网友将网上的真人图片不断喂给模型,让其自主学习,训练出来的效果已…

透视AI技术:探索折射技术在去衣应用中的奥秘

引言: 随着人工智能技术的飞速发展,其在图像处理和计算机视觉领域的应用日益广泛。其中,AI去衣技术作为一种颇具争议的应用,引发了广泛的讨论和关注。本文将深入探讨折射技术在AI去衣中的应用及其背后的原理。 一、AI去衣技术简介…

小红书引流获客软件,轻松成为爆款达人

在这个信息爆炸的时代,小红书凭借其独特的内容分享社区模式,迅速成为了品牌和个体创业者不可忽视的营销宝地。作为一个集生活方式分享、购物心得、美妆教程、旅行攻略等于一身的平台,小红书聚集了大量追求品质生活的年轻用户群体。对于想要在…

【传知代码】知识图谱推理-论文复现

文章目录 概述方法介绍核心逻辑实验条件数据集实验步骤实验结果 核心代码小结 本文涉及的源码可从知识图谱推理该文章下方附件获取 概述 本研究深入探讨了基于图神经网络(GNN)的知识图谱推理,特别聚焦于传播路径的优化与应用。在智能问答、推…

【条形码code39】基础知识

条形码-39码(code39) 符号集。(共43个字符)包括 数字0 ~ 9,大写字母A~Z,空格,-,。,$,/,,% Extended Code39,支持全部ASCII字符。 完整的code39条形码:起始字符( * ) 数据数值 (可选的&#…