当前位置: 首页 > news >正文

【初阶数据结构】深入解析队列:探索底层逻辑

请添加图片描述

🔥引言

本篇将深入解析队列:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈初阶数据结构笔记专栏: 初阶数据结构笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

文章目录

  • 一、队列的概念及结构
  • 二、实现队列的相关接口(Stack.h)
    • 2.1 队列初始化
    • 2.2 队尾入队列
    • 2.3 队头出队列
    • 2.4 获得队列头部元素
    • 2.5 获得队列尾部元素
    • 2.6 获取队列中有效元素个数
    • 2.7 检测队列是否为空
    • 2.8 打印队列数据
    • 2.9 队列的销毁
  • 三、循环队列

一、队列的概念及结构

队列是指只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列具有先进先出 FIFO(First In First Out) 这一点跟栈的先进后出是相反的

  • 入队列:进行插入操作的一端并且称为队尾

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

队列可用通过数组或链表结构实现,一般推荐使用链表实现更优一点。如果使用数组实现在出队列时,需要挪移大量数据,效率较低

这里采用链表结构实现队列

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/在这里插入图片描述

在这里插入图片描述

在设计队列结构中,需要设计两个指针去控制队列各节点的情况。head(队头指针)指向实际对头元素,taill(队尾指针),指向实际队尾元素,增加一个变量size用于统计元素个数,由于存在多种信息,可以使用结构体统一管理

在这里插入图片描述

二、实现队列的相关接口(Stack.h)

在这里插入图片描述

2.1 队列初始化

void QueueInit(Queue *pq)//所以导致了需要初始化
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}

这里需要注意的是:这里不需要对于节点进行初始化,在创建节点时会完成对应的初始化工作。

2.2 队尾入队列

void QueuePush(Queue* pq, QDataType x)
{assert(pq);Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));if (newnode == NULL){perror("malloc fail!!!");return ;}//创建为需要初始化下newnode->next = NULL;newnode->val = x;if (pq->phead == NULL)pq->phead = pq->ptail = newnode;else{(pq->ptail)->next = newnode;pq->ptail = newnode;}pq->size++;
}

这里需要注意的是:首先就是空间开辟失败,然后需要搞清楚我们申请空间是给谁使用的,这里是为节点开辟空间。而不是为Queue结构体对象开辟空间,这里节点之间连接是通过节点指针进行连接

2.3 队头出队列

void QueuePop(Queue* pq)
{assert(pq && pq->phead);Qnode *del = pq->phead;pq->phead = pq->phead->next;free(del);del == NULL;if (pq->phead == NULL){pq->ptail = NULL;}pq->size--;
}

这里需要注意的是:当队列为空时,意味着头指针为空,那么尾指针也需要置成空

2.4 获得队列头部元素

QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}

2.5 获得队列尾部元素

QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->phead);return pq->ptail->val;
}

2.6 获取队列中有效元素个数

int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

2.7 检测队列是否为空

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

2.8 打印队列数据

void QueuePrint(Queue* pq)
{assert(pq);while (!QueueEmpty(pq)){printf("%d->", QueueFront(pq));QueuePop(pq);}
}

这里需要注意的是:这里不能用cur,因为cur是不会动的,phead在pop的时候一直移动

2.9 队列的销毁

void QueueDestroy(Queue* pq)
{assert(pq);Qnode* cur = pq->phead;while (cur)//删除的作用{Qnode* next = cur->next;free(cur);cur = next;}pq->ptail = NULL; pq->phead = NULL;pq->size = 0;
}

这里需要注意的是:这里cur不要手动置空,会跳出循环,需等待cur自动指向空

三、循环队列

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型 时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。(会单独一篇来讲述)

在这里插入图片描述


请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二初阶数据结构笔记,希望对你在学习初阶数据结构中有所帮助!

相关文章:

【初阶数据结构】深入解析队列:探索底层逻辑

🔥引言 本篇将深入解析队列:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 &#…...

Go 语言环境搭建

本篇文章为Go语言环境搭建及下载编译器后配置Git终端方法。 目录 安装GO语言SDK Window环境安装 下载 安装测试 安装编辑器 下载编译器 设置git终端方法 总结 安装GO语言SDK Window环境安装 网站 Go下载 - Go语言中文网 - Golang中文社区 还有 All releases - The…...

javascript v8编译器的使用记录

我的机器是MacOS Mx系列。 一、v8源码下载构建 1.1 下载并更新depot_tools git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH/path/to/depot_tools:$PATH 失败的话可能是网络问题,可以试一下是否能ping通,连…...

C语言--vs使用调试技巧

1.什么是bug? 1.产品说明书中规定要做的事情,而软件没有实现。 2.产品说明书中规定不要做的事情,而软件确实现了。 3.产品说明书中没有提到过的事情,而软件确实现了。 4.产品说明书中没有提到但是必须要做的事情,软件确没有实…...

Spring Boot中的国际化配置

Spring Boot中的国际化配置 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Spring Boot应用中实现国际化配置,使得应用能够轻松…...

WPF的IValueConverter用于校验和格式化TextBox的数字输入

在数据绑定(Data Binding)的上下文中,我们经常使用继承 IValueConverter 接口的类,用于在源值和目标值之间进行转换。该接口定义了两个方法:Convert 和 ConvertBack,这两个方法分别用于从源值到目标值的转换…...

SQL Server的守护神:Always On 高可用性详解

🛡️ SQL Server的守护神:Always On 高可用性详解 在企业级应用中,数据的可用性和业务连续性至关重要。SQL Server的Always On功能提供了一个高可用性解决方案,确保数据库服务的持续运行和快速故障恢复。本文将详细解释SQL Serve…...

Eureka入门

Eureka是一种服务发现工具,广泛应用于微服务架构中。它主要由Netflix开源,帮助服务在分布式系统中自动注册和发现。以下是Eureka的基本入门指南。 前提条件 在开始之前,确保你已经安装了以下软件: JDK 8或更高版本Maven或Gradl…...

高阶面试-netty部分

介绍下netty Netty 是一个基于 Java 的异步事件驱动的网络应用框架,提供了用于快速开发高性能、高可扩展性的协议服务器和客户端的工具 BIO、NIO、AIO 的区别是什么 BIO blocking io,同步阻塞IO,比较简单,为每个请求分配一个线…...

在 C++的跨平台开发中,如何处理不同操作系统和编译器之间的细微差异,以确保程序能够稳定且高效地运行?

在 C 的跨平台开发中,处理不同操作系统和编译器之间的细微差异是非常重要的。以下是一些处理差异的技巧: 使用条件编译:使用预处理指令,根据不同的操作系统和编译器来编写不同的代码。 #if defined(_WIN32)// Windows 特定代码 …...

独孤思维:脑子不好使,副业稳赚钱

01 副业,贴身级模仿。 比如独孤最近在测试dy虚拟资料项目。 跑了三个多月。 赚了点下小钱。 从最开始的自动生成视频,到后来的抽帧优化,再到先做的矩阵玩法。 一直都在迭代。 是独孤脑子好使吗? 恰恰相反。 正式因为独孤…...

【数据结构】(C语言):二叉搜索树

二叉搜索树: 树不是线性的,是层级结构。基本单位是节点,每个节点最多2个子节点。有序。每个节点,其左子节点都比它小,其右子节点都比它大。每个子树都是一个二叉搜索树。每个节点及其所有子节点形成子树。可以是空树。…...

泛微开发修炼之旅--23基于ecology自研的数据库分页组件(分页组件支持mysql、sqlserver、oracle、达梦等)

一、使用场景 ecology二开开发过程中,经常要使用到分页查询,随着信创项目的到来,各种国产数据库的出现,对于数据库分页查询兼容何种数据库,就迫在眉睫。 于是,我自己基于ecology开发了一个分页插件&#…...

《昇思25天学习打卡营第4天 | mindspore Transforms 数据变换常见用法》

1. 背景: 使用 mindspore 学习神经网络,打卡第四天; 2. 训练的内容: 使用 mindspore 的常见的数据变换 Transforms 的使用方法; 3. 常见的用法小节: 支持一系列常用的 Transforms 的操作 3.1 Vision …...

【Python时序预测系列】基于LSTM实现多输入多输出单步预测(案例+源码)

这是我的第312篇原创文章。 一、引言 单站点多变量输入多变量输出单步预测问题----基于LSTM实现。 多输入就是输入多个特征变量 多输出就是同时预测出多个标签的结果 单步就是利用过去N天预测未来1天的结果 二、实现过程 2.1 读取数据集 dfpd.read_csv("data.csv&qu…...

git客户端工具之Github,适用于windows和mac

对于我本人,我已经习惯了使用Github Desktop,不同的公司使用的代码管理平台不一样,就好奇Github Desktop是不是也适用于其他平台,结果是可以的。 一、克隆代码 File --> Clone repository… 选择第三种URL方式,输入url &…...

ai除安卓手机版APP软件一键操作自动渲染去擦消稀缺资源下载

安卓手机版:点击下载 苹果手机版:点击下载 电脑版(支持Mac和Windows):点击下载 一款全新的AI除安卓手机版APP,一键操作,轻松实现自动渲染和去擦消效果,稀缺资源下载 1、一键操作&…...

Unity获取剪切板内容粘贴板图片文件文字

最近做了一个发送消息的unity项目,需要访问剪切板里面的图片文字文件等,翻遍了网上的东西,看了不是需要导入System.Windows.Forms(关键导入了unity还不好用,只能用在纯c#项目中),所以我看了下py…...

利用谷歌云serverless代码托管服务Cloud Functions构建Gemini Pro API

谷歌在2024年4月发布了全新一代的多模态模型Gemini 1.5 Pro,Gemini 1.5 Pro不仅能够生成创意文本和代码,还能理解、总结上传的图片、视频和音频内容,并且支持高达100万tokens的上下文。在多个基准测试中表现优异,性能超越了ChatGP…...

极狐GitLab 17.0 重磅发布,100+ DevSecOps功能更新来啦~【一】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab :https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则&#xf…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

微服务通信安全:深入解析mTLS的原理与实践

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...