【轻松掌握数据结构】队列
第二章 队列文章目录第二章 队列前言一、队列是什么二、概念1.先进先出First In First Out2.入队列和出队列三.队列的使用1.常用方法和功能四.常用特殊队列1.循环队列1概念2下标的计算3循环队列判空判满的条件2.双端队列Deque1概念2使用五.这有几道题~总结前言又见面啦不知道大家那边最近有没有下雨啊今早发现雨水渗进来地上的书箱底儿都软了搬起来时书从下面掉出一看竟然是我第一本放进去的《你瞅啥》怎么样这正在“删除元素”的书箱像不像我们本期的主角——队列嘎不像吗请看下文没错本期依旧会用最简答的例子来向大家介绍队列的概念和用法轻松掌握现在让我们开始吧~一、队列是什么队列Queue是只允许在⼀端进⾏插⼊数据操作在另⼀端进⾏删除数据操作的特殊线性表。依旧和书箱一样书只能从向上开口处放进去也只能从箱子底漏出。漏了的箱子QAQ二、概念1.先进先出First In First Out先进先出缩写是FIFO,这个在我们的选择题里面也经常出现要记住哦~漏了的书箱在放书时我们先放一本《我的箱子》再放一本《漏了》现在我们搬起书箱大声念出来你会先后看到什么没错先是《我的箱子》然后又“啪——”的一声《漏了》。先放进去的会先掉出来后放进去的后掉出来。这就是先进先出图片上场~请注意这里队头指向第一个放入元素的位置队尾指向最后可以插入元素的空位不要搞混哦~2.入队列和出队列⼊队列插入元素到队尾进⾏插⼊操作的⼀端称为队尾Tail/Rear出队列删除队头元素进⾏删除操作的⼀端称为队头Head/Front以上就是队列的全部概念啦~怎么样这是不是和破了的书箱一样哈哈现在让我们一起进入下一个环节——队列Queue的使用。三.队列的使用在Java中Queue是个接口不能被实例化其底层是通过链表实现的。Queue这一行主要是为了凸显一下我们今天的主角~无奖竞猜这串英文在本行以上出现过几次结尾公布1.常用方法和功能方法功能boolean offer(E e)入队列E poll()出队列peek()获取队头元素int size()获取队列中有效元素个数boolean isEmpty()检测队列是否为空现在让我们狠狠地使用它们注意Queue是个接口在实例化时需要实例化LinkedList的对象因为LinkedList实现了Queue接口。publicstaticvoidmain(String[]args){QueueIntegerqnewLinkedList();q.offer(1);q.offer(3);q.offer(9);q.offer(2);q.offer(0);// 从队尾⼊队列System.out.println(q.size());//5System.out.println(q.peek());// 获取队头元素 1q.poll();//删除元素 1System.out.println(q.poll());// 从队头出队列并将删除的元素返回 3if(q.isEmpty()){System.out.println(队列空);}else{System.out.println(q.size());}}概念讲完了应用也举例了那么接下来结束……等一下不知道大家有没有想过如果队列不是漏底的箱子而是一根可伸缩的吸管他既可以竖着放变成队列也被弯成一个环还可以横着放……什么太啰嗦要走不不不要着急看到这里的你已经打败了99%的人马上就能提现了现在让我们欢迎循环队列和双端队列四.常用特殊队列1.循环队列1概念实际中我们有时还会使用一种队列叫循环队列。如生产者者消费者模型就会使用循环队列这个在选择题里经常看到。环形队列通常使⽤数组实现没错就是一个数组围成的圆圈结合下面图片更好理解哦~。当没有元素的时候队头front和队尾rear指向同一个位置。当我们放入一个元素的时候front位置不变rear指向下一个位置也就是下一个可以放入元素的空位。删除元素需要从队头删除也就是rear不变front位置设为null并向后移动一个位置2下标的计算这个简单由图可知当front往后时下标加一同样rear往前下标减……诶真的对吗大错特错试想一下当我一直重复入队出队操作front到达图片中位置5时加1下标为6可队列中并没有这个下标同理当rear在下表为0的位置时减1为-1这个下标可不大对劲——所以下标最后再往后(offset array.length): index (index offset) % array.length下标最前再往前(offset array.length): index (index array.length - offset) % array.length怎么样突然来上这么一大串是不是有点蒙嘿嘿我第一次看的时候也是。不过没关系现在我来为大家解释一下~队头 front 指向队头元素的位置。队尾 rear 指向队尾元素的下一个位置。队列长度为 N 采用“牺牲一个空位”的方式判空/判满因此最多存储 N-1 个元素。第二个公式推导当 rear front 时有效长度就是 rear - front 。当 rear front 时说明队列发生了“绕圈”直接相减会得到负数所以要加上 N 变成 rear - front N 。最后对 N 取模 % N 就能保证无论哪种情况结果都是 [0, N-1] 之间的有效长度。举例N % N 0N1 % N 1N2 % N 2OK这个懂了相信第一个也难不倒你请大家根据同样的原理来推导一下第一个公式。让我们进入下一个环节——3循环队列判空判满的条件结合前文出现的图不难发现当队列为空的时候front和rear指向一处所以循环队列的判空条件 front rear so easy那接下来随着元素不断offer当最后一个元素侵占rear的位置无家可归的它该何去何从嗯没错循环队列的判满条件front rear有爱就有家版可问题来了判空条件和判满条件一样的时候怎么来区分才能防止溢出呢方法来啦~通过添加 size 属性记录保留⼀个位置使用标记• 初始状态队列为空时front rear 0标志位 isFull false。• 每次⼊队检查rear是否与 front 重合如果重合设置 isFull true表⽰队列已满否则正常入队并移动 rear• 出队时移动 front 指针设置 isFull false判断空 return !isFull front rear;判断满 return isFull;嘿嘿简单吧其实还有一个办法可以让rear舒舒服服祝自己的房子不知道大家有没有注意到在前面推导公式介绍队列长度为N时有一句“采用‘牺牲一个空位’的方式判空/判满”。没错另一个方法就是留一个空间。这样就能直接通过公式来判断下一个位置下标是否和front的相等判断了判断满front(rear 1) % array.length;重生之住上豪华单人大别野版好啦方法就是这些如果小伙伴们想到了别的办法欢迎在评论区留言哦~现在有请另一位主角登场……大家不要走我保证这是最后一个知识碎片 QAQ2.双端队列Deque1概念双端队列Deque是指允许两端都可以进⾏⼊队和出队操作的队列deque 是 “double ended queue” 的简称。那就说明元素可以从队头出队和⼊队也可以从队尾出队和⼊队。这里可以想象奶茶店的玻璃吸管把它横过来左右两端都可以放入一粒西米左右倾斜两边都可以倒出西米想喝果茶了。果茶……图片来也2使用Deque也是⼀个接口使用时必须创建LinkedList的对象DequeIntegerstacknewArrayDeque();//双端队列的线性实现DequeIntegerqueuenewLinkedList();//双端队列的链式实现头部队首操作addFirst(e) / offerFirst(e) 头部添加removeFirst() / pollFirst() 头部删除getFirst() / peekFirst() 获取头部尾部队尾操作addLast(e) / offerLast(e) 尾部添加removeLast() / pollLast() 尾部删除getLast() / peekLast() 获取尾部简单嘛这几个方法一看就会用。‘/’ 前面后面都一样用双重选择更贴心可是‘/’前面后面真的没区别吗上表格举例抛异常版返回布尔/null版作用addFirstofferFirst头部添加addLastofferLast尾部添加五.这有几道题~1.用队列实现栈2.用栈来实现队列3.设计循环队列总结今天讲了很多主要有队列的概念、用法、下标移动还有两个特殊的常用队列的概念及其用法奖励了自己……嗯今天就到这里祝大家好梦出现那串神秘字母的次数8哦~有找到吗

相关新闻

【轻松掌握数据结构】栈

【轻松掌握数据结构】栈

第一章 栈 文章目录第一章 栈前言一、栈(Stack)是什么?二、概念1.后进先出(Last In First Out)2.压栈和出栈三.栈的使用1. 常用方法和功能2.栈的应用总结前言 本章会用最简单的话来讲什么是栈。本章附有代码&#xff…

2026/7/22 7:51:09 阅读更多 →
Python程序打包实战:PyInstaller深度指南

Python程序打包实战:PyInstaller深度指南

1. Python程序打包的核心价值与场景打包Python程序是将.py源代码转换为可独立运行文件的过程,这解决了Python环境依赖的核心痛点。想象一下,你开发了一个数据分析工具,交给同事使用时对方却因为缺少numpy库而报错——这正是打包技术要解决的问…

2026/7/22 8:01:46 阅读更多 →
iOS模拟器命令行高效操作指南

iOS模拟器命令行高效操作指南

1. 项目概述作为一名iOS开发者,我每天都要和模拟器打交道。但直到三年前一次偶然的机会,我才发现原来通过命令行可以如此高效地操控模拟器。记得那天我正在调试一个需要频繁重启模拟器的项目,重复的GUI操作让我疲惫不堪。同事看我一脸烦躁&am…

2026/7/22 8:27:58 阅读更多 →

最新新闻

Linux进程权限

Linux进程权限

本文是Linux系统下讨论。注意,Linux和Unix有很多不同的地方,并且各个不同的Unix系统也有很多不同。 本文讨论对象: ruid: real user id,即实际用户,也即当前登录的用户euid: effective user id, 即有效用…

2026/7/23 1:20:49 阅读更多 →
HarmonyOS ArkTS 实战:实现一个校园证件照拍摄与预约应用

HarmonyOS ArkTS 实战:实现一个校园证件照拍摄与预约应用

HarmonyOS ArkTS 实战:实现一个校园证件照拍摄与预约应用 项目效果 本文使用 HarmonyOS 和 ArkTS 实现一个校园证件照拍摄与预约应用。 应用可以预约证件照拍摄,选择证件照尺寸,在线选片,查看拍摄样片,并提供拍摄预约、照片下载、打印配送等功能。 项目使用 DevEco Studio…

2026/7/23 1:20:49 阅读更多 →
Tiva™ C系列外设管理:PP与SR寄存器实战指南

Tiva™ C系列外设管理:PP与SR寄存器实战指南

1. 从寄存器手册到实战:Tiva™ C系列外设管理的核心逻辑如果你和我一样,长期泡在嵌入式开发的一线,特别是基于ARM Cortex-M内核的MCU,那你肯定对“外设管理”这四个字深有感触。它远不止是初始化几个时钟、配置几个引脚那么简单。…

2026/7/23 1:20:49 阅读更多 →
深入解析ADC转换组:从基础原理到Hercules MCU高级应用

深入解析ADC转换组:从基础原理到Hercules MCU高级应用

1. ADC转换组:从“单兵作战”到“协同作战”的进化在嵌入式系统,尤其是实时控制系统的开发中,模数转换器(ADC)的角色,就像是系统的“感官”。它负责将外部世界的连续模拟信号(如温度、压力、电压…

2026/7/23 1:20:49 阅读更多 →
TM4C129XNCZAD系统控制寄存器深度解析:从芯片识别到时钟配置实战

TM4C129XNCZAD系统控制寄存器深度解析:从芯片识别到时钟配置实战

1. 项目概述与核心价值在嵌入式开发的底层世界里,系统控制寄存器就像是微控制器(MCU)的“神经中枢”和“身份档案库”。对于使用Tiva™ C系列TM4C129XNCZAD这类高性能ARM Cortex-M4内核MCU的工程师来说,仅仅会调用HAL库或驱动函数…

2026/7/23 1:20:49 阅读更多 →
内存覆盖和内存交换

内存覆盖和内存交换

覆盖和交换技术是在多道程序环境下用来扩充内存的两种方法。覆盖技术主要用在早期的操作系统中,而交换技术则在现代操作系统中仍具有较强的生命力。1、内存覆盖(Overlay)在早期的计算机系统中,主存容量很小。虽然主存中仅存放一道…

2026/7/23 1:19:49 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻