深入探讨JavaScript中的队列,结合leetcode全面解读

前言

队列作为一种基本的数据结构,为解决许多实际问题提供了有效的组织和处理方式,对于提高系统的稳定性、可靠性和效率具有重要作用,所以理解队列是很重要的。

本文深入探讨JavaScript中的队列这种数据结构,结合leetcode题目讲解

题目直达:

232. 用栈实现队列 - 力扣(LeetCode)

239. 滑动窗口最大值 - 力扣(LeetCode)

什么是队列

队列是一种特殊的线性表数据结构,它遵循“先进先出”(First-In-First-Out,FIFO)的原则

即先进入队列的元素先出队列,进去是abc的顺序,出来也是abc的顺序

image.png

JavaScript实现队列

JavaScript 中,没有专门的一个关键词来直接表示队列。

可以使用数组的方法来模拟队列的行为。

常见的实现方式

  • 数组的 push() 方法在队尾添加元素,使用 shift() 方法在队首移除元素

  • 数组的 pop()在队尾删除元素、unshift()方法在队添加元素

既然我们明白了这个点,我们就知道了,如果要从队列里面拿数据就一定会造成队列长度发生变化

所以队列的遍历不能用for循环,队列的长度是动态变化的

分析一下下面的代码

const queue = []queue.push('a')
queue.push('b')
queue.push('c')for (let i = 0; i < queue.length; i++) {const top = queue.shift()console.log(top);
}

这段代码的执行结果为

image.png

这并不是我们想要的结果,这就是因为在循环中使用 shift 方法会导致每次循环时队列的长度发生变化,从而导致循环次数不正确

我们可以使用两种方式去遍历

  • 使用一个临时变量来保存队列的初始长度,然后基于这个长度进行循环操作
const queue = [];queue.push('a');
queue.push('b');
queue.push('c');const length = queue.length;
for (let i = 0; i < length; i++) {const top = queue.shift();console.log(top);
}
  • 使用while循环去遍历,只要队列的长度大于 0,就会不断从队列中取出元素并打印
const queue = [];queue.push('a');
queue.push('b');
queue.push('c');while (queue.length > 0) {const top = queue.shift();console.log(top);
}

232. 用栈实现队列 - 力扣(LeetCode)

题目直达232. 用栈实现队列 - 力扣(LeetCode)

接下来我们用232题来讲解一下栈数据结构,首先分析题目

image.png

题目要求我们去打造一个栈结构,并且实现一系列的方法

既然是使用两个栈去实现,首先我们肯定是需要去准备两个栈

var MyQueue = function () {this.stack1 = []this.stack2 = []
};

接下来我们考虑如何通过这两个栈去实现队列效果呢?

动画.gif

从这个动画我们 可以看到,我们首先去存入到stack1,然后再存入stack2,这样就实现了翻转,就能够实现先进先出的效果了

接下来我们就编写代码

var MyQueue = function () {this.stack1 = []this.stack2 = []
};MyQueue.prototype.push = function (x) {this.stack1.push(x)
};MyQueue.prototype.pop = function () {if (this.stack2.length === 0) {while (this.stack1.length) {this.stack2.push(this.stack1.pop())}}return this.stack2.pop()
};MyQueue.prototype.peek = function () {if (this.stack2.length === 0) {while (this.stack1.length) {this.stack2.push(this.stack1.pop())}}return this.stack2[this.stack2.length - 1]
};MyQueue.prototype.empty = function () {return this.stack1.length === 0 && this.stack2.length === 0
};
  1. MyQueue 类的构造函数:

    • 初始化了两个空数组 stack1stack2,用于模拟队列的操作。
  2. push 方法:

    • 接收一个参数 x,将其直接压入 stack1 。这相当于向队列的尾部添加元素。
  3. pop 方法:

    • 首先检查 stack2 是否为空。
    • 如果为空,通过一个 while 循环,将 stack1 中的元素逐个弹出并压入 stack2 。这样就实现了将 stack1 中的元素顺序反转,从而模拟出队列的出队操作。
    • 最后,从 stack2 中弹出并返回顶部元素。
  4. peek 方法:

    • pop 方法类似,先检查 stack2 是否为空,如果为空则进行元素转移。
    • 然后返回 stack2 的最后一个元素,但不将其弹出,实现了查看队列头部元素的功能。
  5. empty 方法:

    • 检查 stack1stack2 的长度是否都为 0,如果都是 0 则表示队列为空,返回 true;否则返回 false

239. 滑动窗口最大值 - 力扣(LeetCode)

题目直达239. 滑动窗口最大值 - 力扣(LeetCode)

image.png

var maxSlidingWindow = function (nums, k) {var a = 0;var b = k - 1;var arr = []while (b < nums.length) {var max = -Infinityfor (var i = a; i <= b; i++) {if (max < nums[i])max = nums[i];}arr.push(max)a++b++}return arr;
};var maxSlidingWindow = function (nums, k) {const len = nums.lengthconst res = []const queue = []//维护一个递减队列for (let i = 0; i < length; i++) {while (queue.length && nums[i] > queue[queue.length - 1]) {queue.pop()}queue.push(nums[i])while (queue.length && queue[0] <= i - k) {queue.shift()}if (i >= k - 1) {arr.push(nums[queue[0]])}}return res
}

第一段代码:

  • 它使用了两个指针 ab 来表示滑动窗口的起始和结束位置。
  • 在每次滑动窗口中,通过一个内层的循环遍历窗口内的所有元素来找到最大值,并将其添加到结果数组 arr 中。
  • 这种方法的时间复杂度较高,因为对于每个窗口都需要进行一次遍历查找最大值。

第二段代码:

  • 它使用一个单调递减的队列 queue 来维护滑动窗口内可能成为最大值的元素。
  • 当新元素大于队列末尾的元素时,将末尾元素弹出,以保持队列的递减性质。
  • 当队列头部的元素不在当前窗口范围内时,将其移出队列。
  • 当窗口滑动到足够长度后,将队列头部的元素作为当前窗口的最大值添加到结果数组 res 中。

总结

本文介绍了JavaScript中的队列,结合leetcode全面解读

希望看到这里的你能够有所收获!!!!!!!

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

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

相关文章

DolphinScheduler部署安装or基础介绍(一)

DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用 DolphinScheduler核心架构 DolphinScheduler的主要角色如下&#xff1a; Ma…

2024攻防演练:亚信安全推出MSS/SaaS短期定制服务

随着2024年攻防演练周期延长的消息不断传出&#xff0c;各参与方将面临前所未有的挑战。面对强大的攻击队伍和日益严格的监管压力&#xff0c;防守单位必须提前进行全面而周密的准备和部署。为应对这一形势&#xff0c;亚信安全特别推出了为期三个月的MSS/SaaS短期订阅方案。该…

一站式配套,全方位服务升级——全力打造企业新家园

国际数字影像产业园通过完善配套设施和优化服务&#xff0c;为入园企业提供了高效、便捷、专业的服务支持&#xff0c;助力企业实现快速发展和转型升级。同时&#xff0c;园区的数字化和智能化发展策略也为整个数字影像产业的繁荣发展提供了有力支撑。 一、完善配套设施 1、高…

程序包lombok不存在,解决办法。

当前方法是针对于代码没有报错&#xff0c;本身有lombok jar包的情况 1.找到本地maven仓库中的已经下载好的lombok包&#xff0c;删掉。 2. 直接刷新maven&#xff0c;会重新下载lombok jar包&#xff0c;此时再启动项目时就可以正常运行了。

UE4_材质基础_切线空间与法线贴图

学习笔记&#xff0c;不喜勿喷&#xff0c;侵权立删&#xff0c;祝愿大家生活越来越好&#xff01; 一、切线空间 在《OpenGL基础11&#xff1a;空间》中提到了观察空间、裁剪空间、世界空间等。切线空间和它们一样&#xff0c;都属于坐标空间 上面就是一个…

Lesson 46 Can you ... ?

Lesson 46 Can you … ? 词汇 lift v. 拿起&#xff0c;搬起 n. 电梯&#xff08;直梯&#xff09; 用法&#xff1a;1. lift … up 拎起……    例句&#xff1a;我可以拎起那只小猫。       I can lift that cat up.    2. take a lift    例句&#xff1a…

如何在Docker容器中,修改MySQL密码

如果MySQL运行在Docker容器中&#xff0c;修改MySQL密码的方法稍有不同。以下是如何在Docker中修改MySQL密码的步骤&#xff1a; 方法1&#xff1a;使用MySQL命令行工具 1. 找到MySQL容器的ID或者名字&#xff1a; docker ps 2. 进入MySQL容器&#xff1a; docker exec -i…

mongodb在windows环境安装部署

一、mongodb 1.释义 MongoDB 是一种开源的文档型 NoSQL 数据库管理系统&#xff0c;使用 C 编写&#xff0c;旨在实现高性能、高可靠性和易扩展性。MongoDB 采用了面向文档的数据模型&#xff0c;数据以 JSON 风格的 BSON&#xff08;Binary JSON&#xff09;文档存储&#x…

VSCode使用SSH无需输入密码远程连接服务器

目录 一、密钥生成 1、使用windows11自带的命令行 2、使用putty工具 二、查看密钥 三、设置服务器 这个过程是比较简单的&#xff0c;为了方便后续留用和查看&#xff0c;整理个笔记放着。 一、密钥生成 1、使用windows11自带的命令行 在任一文件夹中&#xff0c;空白处…

数据融合平台的概述、特点及技术方案

在当今数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;数据的分散存储和格式不一&#xff0c;常常导致数据孤岛现象&#xff0c;使得数据的潜在价值难以被充分挖掘和利用。在这样的背景下&#xff0c;数据融合平台应运而生&#xff0c;它的意义不仅在…

amis中条件组合器condition-builder的使用 和 解析

1.amis中配置一个条件组合器&#xff0c;condition-builder。并根据自己业务需求配置source。这里用了一些自定义filter来进行预处理。 {"type": "condition-builder","label": "条件组合","name": "node.conditions&q…

Python 插入、替换、提取、或删除Excel中的图片

Excel是主要用于处理表格和数据的工具&#xff0c;我们也能在其中插入、编辑或管理图片&#xff0c;为工作表增添视觉效果&#xff0c;提升报告的吸引力。本文将详细介绍如何使用Python操作Excel中的图片&#xff0c;包含以下4个基础示例&#xff1a; 文章目录 Python 在Excel…

.NET 漏洞情报 | 某整合管理平台SQL注入

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

AI-算力集群通往AGI

背景&#xff1a; 自GPT-4发布以来&#xff0c;全球AI能力的发展势头有放缓的迹象。 但这并不意味着Scaling Law失效&#xff0c;也不是因为训练数据不够&#xff0c;而是结结实实的遇到了算力瓶颈。 具体来说&#xff0c;GPT-4的训练算力约2e25 FLOP&#xff0c;近期发布的几个…

驱使ai学习搭子,写出一份“完美”的代码“文档”

自己把控“核心关键”&#xff0c;ai会把文档写得比您预想的“完美”。 (笔记模板由python脚本于2024年07月04日 10:44:39创建&#xff0c;本篇笔记适合喜欢结伴ai学习的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff…

PHP房产小程序微信小程序系统源码

&#x1f3e0;—— 购房租房&#xff0c;一“指”搞定&#x1f3e1; &#x1f50d;【开篇&#xff1a;房产新视界&#xff0c;尽在掌握】 在这个信息爆炸的时代&#xff0c;找房子不再是一场漫长的奔波。有了“房产微信小程序”&#xff0c;无论是购房还是租房&#xff0c;都…

【PCIe】P2P DMA

PCIe P2P (peer-to-peer communication)是PCIe的一种特性&#xff0c;它使两个PCIe设备之间可以直接传输数据&#xff0c;而不需要使用主机RAM作为临时存储。如下图3的走向 比如EP1要发送和数据给EP2,操作流程如下&#xff1a; 1. 打开EP1的dma控制器&#xff1b;--client侧 …

配置jupyter时出现问题?怎么办?

在自己创建的虚拟环境&#xff08;nmjpytorch&#xff09;安装完jupyter&#xff0c;没有跳转到链接&#xff0c;问题如图&#xff1a; 解决方法&#xff1a; 1、查看自己的tornado版本为5.1.1&#xff0c;坑太高了&#xff0c;降低版本为4.5.3 2、卸载tornado-5.1.1 3、安装t…

firewalld(7)NAT、端口转发

简介 在前面的文章中已经介绍了firewalld了zone、rich rule等规则设置&#xff0c;并且在iptables的文章中我们介绍了网络防火墙、还有iptables的target,包括SNAT、DNAT、MASQUERADE、REDIRECT的原理和配置。那么在这篇文章中&#xff0c;将继续介绍在firewalld中的NAT的相关配…

git常用命令速查表

Git相关概念简述 版本库&#xff1a;git在本地开辟的一个存储空间&#xff0c;一般在 .git 文件里。工作区(workspace)&#xff1a; 就是编辑器里面的代码&#xff0c;我们平常开发直接操作的就是工作区。暂存区&#xff08;index/stage&#xff09;&#xff1a;暂时存放文件的…