目录

1)双端队列的介绍

2)双端队列用双链表的实现代码演示

3)双端队列用固定数组的实现

代码演示


视频

【算法讲解016【入门】双端队列-双链表和固定数组实现】

Leecode

leecode641 设计循环双端队列


1)双端队列的介绍

可以从头部进,可以从头部出;也可以从尾部进,可以从尾部出。这种结构叫双端队列

双向链表为了跳转容易,在数外边设置一个节点包着,前指针,后指针。

比如我之前有个a,头指空,尾指空。

我现在又加了个b,那么b的头指针指向a,尾指针指向空,尾巴来到b上

我再加个c,一样的。我又想在头部加个d,一样思路所以头部加数 尾部加数就会了

头部弹出 尾部弹出怎么办?

头部弹出

头移到a,a的前指针指向null,c或c++的同学把d释放掉,java会自己释放不用管。

同样方法把a弹出。

想从尾部弹出呢?

尾巴向前跳一个,让b的next指针指向空。c或c++的同学把d释放掉,java会自己释放不用管。

2)双端队列用双链表的实现代码演示

package C16;import java.util.Deque;
import java.util.LinkedList;public class Video_016_Deque {class MyCircularDeque1{//Deque是接口 <Integer>是泛型,相当于Deque<Integer> 的意思就是:“这是一个双端队列,并且我给它贴上了**‘只能存放整数 (Integer)’**的标签。”public Deque<Integer> deque = new LinkedList<>();//“我要声明 (declare) 一个变量,它的名字叫 deque。这个变量是 public(公开)的,并且它的类型是一个贴着 Integer(整数)标签的 Deque(双端队列功能清单)。”public int size;public int limit;/*** 初始化一个容量为k的双端队列* @param k 队列的容量*/public MyCircularDeque1(int k){//“现在,我要创建一个真正能干活的工人(new LinkedList<>()),这个工人完全遵守了 Deque 的规范,然后让我的 deque 变量去管理(指向)这个工人。”deque = new LinkedList<>();//初始时,队列中没有元素size = 0;//设置容量上限limit = k;}/*** 将一个元素添加到队首,如果操作成功,返回true*/public boolean insertFront(int value) {//在插入前检查队列是否已满if(isFull()){return false;//满了,添加失败}//调用LinkList自带的方法offerFirst(),它会高效地将元素添加到链表头部deque.offerFirst(value);//元素数量加1size++;//插入成功return true;}/*** 将一个元素添加到队尾,如果操作成功返回true*/public boolean insertLast(int value){//同样先检查队列是否已经满了if(isFull()){return false;}//调用自带的方法offerLast(),它会高效地将元素添加到链表尾部deque.offerLast(value);size++;return true;}/*** 从队首删除一个元素,如果操作成功返回true*/public boolean deleteFront(){//跟之前一样的操作if(isEmpty()){return false;}deque.pollFirst();size--;return true;}public boolean deleteLast(){if(isEmpty()){return false;}deque.pollLast();size--;return true;}/*** 从队首获取元素,如果队列为空返回-1*/public  int getFront(){if (isEmpty()) {return -1;}// 调用 LinkedList 自带的 peekFirst(),它只查看头部的元素,不移除。return deque.peekFirst();}/*** 获取队尾元素。如果队列为空,返回 -1。* @return 队尾的元素,或 -1。*/public int getRear() {if (isEmpty()) {return -1;}// 调用 LinkedList 自带的 peekLast(),它只查看尾部的元素,不移除。return deque.peekLast();}/*** 检查双端队列是否为空。* @return 为空返回 true,否则返回 false。*/public boolean isEmpty() {// 我们自己维护了 size 变量,用它来判断最简单。return size == 0;}/*** 检查双端队列是否已满。* @return 已满返回 true,否则返回 false。*/public boolean isFull() {// 当 size 达到容量上限时,队列就满了。return size == limit;}}
}

3)双端队列用固定数组的实现

用固定数组(动态也可以)

size,l,r

有没有数字或者满没满,size管。如果size等于0,那么l和r等于啥都没意义。

当加入数字a时,把a放在第零位,l到r位置上放a。即第零位到第零位放a。size变为1。

再加入b,r变为第一位。size再加1。

再加c

再加d。

头部再加个e。

怎么做?

l已经在第零位了,怎么办?

加到最后的位置上。

一共不是k位吗?这道题k是10,所以l来到第k-1位置上,即第9位。所以说总结头部添加的办法:当l==0时,放在第k-1位,l=k-1;

当l≠0时,放在第l-1位,l--。

比如再在头部加个f所以现在从头部到尾部的就是890123这样的顺序。

如果再在头部加个g弹出呢?

从头部弹出,也就是l往右窜。即总结为:头部加数那么l往左窜,头部弹数则l往右窜。这就是l的逻辑。

模拟一下全过程

原来是这样

弹出g

弹出f弹出e..

弹出a

弹出b

 

加入k加入s,加入p,加入l,加入n...

在尾部加入M

所以现在的整个队列就是cdkspcznm

从尾巴弹出总结一下:

从头部加入,l向左走,如果l==0,把数放在k-1的位置,然后赋值l=k-1;

如果l≠0,那么把数放在l-1的位置,然后赋值l--;

从头部出,首先给用户l位置的数[l],如果l==k-1,那么赋值l=0;

如果l≠k-1,那么赋值l++;

从尾部入,如果l==k-1,把数放在0的位置,然后赋值r=0;

如果r≠k-1,那么把数放在r+1的位置,然后赋值r++;

从尾出,首先给用户r位置的数[r],然后要往左走,所以如果r==0,那么r赋值为k-1,即第k-1位;

如果r≠0呢?从尾出那么就是r--就行了。

这就是所有的逻辑 环形双端队列

代码演示

public class MyCircularDeque2 {//底层的数据容器,一个固定大小的数组public  int[] deque;//l:left/front指针,指向队头元素所在的索引//r:right/rear指针,指向队尾元素所在的索引//size:当前队列中的元素数量//limit:队列的容量上限(数组的大小)public int l,r,size,limit;/*** 构造方法:初始化一个容量为k的双端队列*/public MyCircularDeque2(int k){//创建一个能容纳k个整数的数组deque = new int[k];//初始时,所有指针和计数器都为0(或者一个无效状态)l = r = size = 0;//设置容量上限limit = k;}/*** 将一个元素添加到队首*/public boolean insertFront(int value){//先检查是否已经满if(isEmpty()){//队头和队尾指针都指向0号位置l = r = 0;//在0号位置放入新元素deque[0] = value;}else{//如果不为空,我们需要l往左移动,但如果它本来就在最左边,所以我们将它移动到limit-1位置上l = l ==0?(limit - 1):(l - 1);//在计算出的新位置l放入元素deque[1] = value;}//元素数量加1size++;return true;}/*** 将一个元素添加到队尾。*/public boolean insertLast(int value) {if (isFull()) {return false;}if (isEmpty()) {// 和 insertFront 一样,第一个元素 l 和 r 都指向 0l = r = 0;deque[0] = value;} else {// 移动 r 指针,为新元素在“后面”腾出位置// 这是另一个“循环”的关键!// r == limit - 1 ? 0 : (r + 1)// 意思是:// 如果 r 指针已经在末尾了 (limit - 1),那么它的“后一个”位置就是环绕到开头的 0。// 否则,它的后一个位置就是 r + 1。r = r == limit - 1 ? 0 : (r + 1);// 在计算出的新位置 r 放入元素deque[r] = value;}size++;return true;}/*** 从队首删除一个元素。*/public boolean deleteFront() {if (isEmpty()) {return false;}// 删除队首元素,我们只需要把 l 指针向“后”移动一位即可// 同样是循环移动// l == limit - 1 ? 0 : (l + 1)// 意思是:如果 l 在末尾,下一个位置是 0;否则是 l + 1l = l == limit - 1 ? 0 : (l + 1);// 元素数量减 1size--;return true;}/*** 从队尾删除一个元素。*/public boolean deleteLast() {if (isEmpty()) {return false;}// 删除队尾元素,我们只需要把 r 指针向“前”移动一位// 循环移动// r == 0 ? (limit - 1) : (r - 1)// 意思是:如果 r 在开头,前一个位置是 limit - 1;否则是 r - 1r = r == 0 ? (limit - 1) : (r - 1);size--;return true;}/*** 从队首获取元素。*/public int getFront() {if (isEmpty()) {return -1;}// 队首元素就是 l 指针指向的元素return deque[l];}/*** 获取队尾元素。*/public int getRear() {if (isEmpty()) {return -1;}// 队尾元素就是 r 指针指向的元素return deque[r];}public boolean isEmpty() {return size == 0;}public boolean isFull() {return size == limit;}}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffplay视频输出和尺寸变换

视频输出模块 视频输出初始化的主要流程 我们开始分析视频&#xff08;图像&#xff09;的显示。 因为使⽤了SDL&#xff0c;⽽video的显示也依赖SDL的窗⼝显示系统&#xff0c;所以先从main函数的SDL初始化看起&#xff08;节选&#xff09;&#xff1a; int main(int argc, c…

协议_https协议

http http协议是将数据以明文的形式在网络上传输。若是传输的数据中包含一些敏感信息比如银行卡信息等可能会被有心人攻击造成信息泄露或被篡改。 总结&#xff1a;http协议进行数据传输难以保证数据的隐私性以及数据完整性&#xff0c;为了保证数据的准确定引入了https这一协…

阿里云 腾讯云 API 自动化查询指南

文章目录一、核心思路与架构建议二、经验与核心建议三、技术方案选型建议四、API使用详解4.1 阿里云4.2 腾讯云五、进阶&#xff1a;与内部系统联动免费个人运维知识库&#xff0c;欢迎您的订阅&#xff1a;literator_ray.flowus.cn 一、核心思路与架构建议 自动化流程可以概括…

【Unity 性能优化之路——概述(0)】

Unity性能优化概述性能优化不是某个环节的极致压榨&#xff0c;而是所有模块的协同共进。本文将为你建立完整的Unity性能优化知识体系。很多Unity开发者一提到性能优化&#xff0c;首先想到的就是Draw Call、Batches这些渲染指标。这没错&#xff0c;但它们只是性能优化中的一部…

灵码产品演示:软件工程架构分析

作者&#xff1a;了哥 演示目的演示灵码对于整个复杂软件工程项目的架构分析能力&#xff0c;输出项目的软件系统架构图。演示文档接口生成能力。演示准备 克隆工程地址到本地&#xff08;需提前安装好 git 工具&#xff0c; 建议本地配置 brew&#xff09;&#xff1a; git cl…

银河麒麟部署mysql8.0并连接应用

​客户需在国产化银河麒麟系统中部署软件应用&#xff0c;使用mysql8.0数据库。机器放置了两三年&#xff0c;里面命令工具和依赖都不太全。而且客户环境不联网&#xff0c;只能采用离线部署的方式。部署过程中踩了很多坑&#xff0c;也用到很多资源&#xff0c;记录一下。 过…

GitAgent-面壁智能联合清华大学发布的大模型智能体应用框架

本文转载自&#xff1a;https://www.hello123.com/gitagent ** 一、&#x1f50d; GitAgent 框架&#xff1a;大模型智能体的工具箱革命 GitAgent 是由面壁智能与清华大学自然语言处理实验室联合研发的创新型框架&#xff0c;旨在解决大模型智能体在复杂任务中的工具扩展瓶颈…

灵码产品演示:Maven 示例工程生成

作者&#xff1a;轻眉 演示主题&#xff1a;由 AI 自动生成 0 到 1 的电商订单 Java 项目 演示目的 面向 Java 零基础的用户&#xff0c;通过灵码的产品能力&#xff08;如提示词、编码智能体、项目 Rules 和 SQLite MCP 服务、单元测试&#xff09;自动生成 0 到 1 的电商订单…

AI编程从0-1开发一个小程序

小伙伴们&#xff0c;今天我们利用AI实现从0到1开发一个小程序&#xff01;需求交给AI&#xff1a; 我们只要说出自己的开发思路&#xff0c;具体需求交给AI完成&#xff01;输入提示词&#xff1a;个人开发的小程序 能开发哪些好备案&#xff0c;用户喜欢使用的 AI给出…

DDoS高防IP是什么? DDoS攻击会暴露IP吗?

DDoS高防IP是什么&#xff1f;高防IP是指一种网络安全服务&#xff0c;主要用于防御DDoS攻击。随着技术的发展&#xff0c;黑客进行网络攻击的强度也在加大&#xff0c;所以我们要做好网络防护&#xff0c;及时预防DDoS攻击。DDoS高防IP是什么&#xff1f;DDoS高防IP是指基于IP…

k8s事件驱动运维利器 shell operator

Shell-Operator 概述 Shell-Operator 是 Kubernetes 的一个工具&#xff0c;用于通过 shell 脚本扩展集群功能。它允许用户编写简单的脚本&#xff08;Bash、Python 等&#xff09;来响应 Kubernetes 事件&#xff08;如资源变更、定时任务&#xff09;&#xff0c;无需编译复…

(二)文件管理-文件权限-chmod命令的使用

文章目录1. 命令格式2. 基本用法2.1 符号模式2.2 八进制数字模式3. 高级用法3.1 递归操作3.2 参考权限3.3 特殊权限位(Setuid, Setgid, Sticky Bit)3.4 X 特殊执行权限4. 注意事项4.1权限与所有权4.2 Root 权限4.3 安全风险4.4 -R 的风险4.5 目录的执行权限1. 命令格式 chmod …

医院预约挂号脚本

医院预约挂号脚本 功能介绍 本脚本是一个用 Python 编写的医院预约挂号程序&#xff0c;支持以下功能&#xff1a; 自动预约&#xff1a;通过api交互选择医院、科室、医生和时间段。自动监控&#xff1a;持续检查指定医生的号源状态&#xff0c;发现可预约时段时自动尝试预约。…

.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)

在使用MudTools.OfficeInterop.Word库进行Word文档自动化处理时&#xff0c;深入理解Word对象模型的核心组件是至关重要的。Word对象模型提供了一套层次化的结构&#xff0c;使开发者能够通过编程方式控制Word应用程序、文档以及文档内容。本章将详细介绍Word对象模型中最核心的…

Kotlin在医疗大健康域的应用实例探究与编程剖析(上)

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业正经历着深刻的变革。随着信息技术的飞速发展,尤其是人工智能、大数据、物联网等新兴技术的广泛应用,医疗行业数字化转型已成为必然趋势。这种转型旨在提升医疗服务的效率和质量,优化医疗资源配置,为患者提供更加…

AI智能体的应用前景

AI智能体的应用前景正从技术探索迈向规模化落地的关键阶段,其发展动力源于大模型能力的突破、行业需求的深化以及商业化模式的创新。以下是基于最新技术动态和行业实践的深度解析: 一、技术突破:从「有脑无手」到「知行合一」 大模型的进化显著提升了智能体的多模态交互与…

高系分四:网络分布式

目录一、我的导图和思考二、大模型对我导图的评价优点可优化之处三、大模型对这章节的建议一、网络知识范畴&#xff08;一&#xff09;网络基础理论&#xff08;二&#xff09;局域网与广域网&#xff08;三&#xff09;网络安全&#xff08;四&#xff09;网络性能优化&#…

Day24_【深度学习(1)—概念】

一、AI、ML、DL基本关系 机器学习是实现人工智能的途径&#xff0c;深度学习是机器学习的一种方法。人工智能 (AI)↓ 机器学习 (ML) —— 让机器从数据中学习规律↓ 深度学习 (DL) —— 使用深层神经网络的机器学习方法二、深度学习与机器学习概念深度学习&#xff08;Deep Lea…

VTK基础(01):VTK中的基本概念

VTK中的基本概念 1.三维场景中的基本要素 三维场景的基本要素包含&#xff1a;灯光、相机、颜色和纹理映射 (1)灯光vtkLight 光的本质是特定频段的电磁波&#xff0c;所以灯光的本质是特定频段&#xff08;可见光频段&#xff09;的电磁波发射器&#xff1b;依据发射可见光频段…

LeetCode 2348.全0子数组的数目

给你一个整数数组 nums &#xff0c;返回全部为 0 的 子数组 数目。 子数组 是一个数组中一段连续非空元素组成的序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,0,0,2,0,0,4] 输出&#xff1a;6 解释&#xff1a; 子数组 [0] 出现了 4 次。 子数组 [0,0] 出现了 2 次。…