深入探讨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,一经查实,立即删除!

相关文章

在线快速升级nginx

备份现有配置文件和二进制文件&#xff1a; #压缩备份 sudo tar -czvf /usr/sbin/nginx1.21.4_backup.tar.gz /usr/sbin/nginx1.21.4/sudo cp /usr/sbin/nginx1.21.4/conf/nginx.conf /usr/sbin/nginx1.21.4/conf/nginx.conf.bak sudo cp /usr/sbin/nginx1.21.4/sbin/nginx /us…

一、Prometheus和Grafana搭建

一、服务端Prometheus二进制安装 https://prometheus.io/下载过慢可使用迅雷下载 tar -zxvf prometheus-2.53.0.linux-amd64.tar.gz启动 ./prometheus --config.fileprometheus.yml将其配置为系统服务&#xff1a; vim /usr/lib/systemd/system/prometheus.service[Unit] D…

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

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

Google Earth Engine(GEE)——ui.Slider的使用设置1-100的滑块

简介 ui.Slider是一个用户界面控件,用于选择一个值或一个范围。它通常呈现为一个滑块,用户可以通过拖动滑块来选择一个特定的值。Slider可以水平或垂直显示,并且可以自定义外观和样式。 Slider通常具有以下几个重要的属性: - minValue:设置Slider的最小值。 - maxValue…

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

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

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

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

社交相亲的智能匹配:现代APP如何重塑婚恋交友

在数字化时代&#xff0c;婚恋交友方式正经历着一场革命。现代社交相亲APP利用智能匹配技术&#xff0c;为用户提供个性化的推荐&#xff0c;重塑了传统的婚恋交友模式。 一、现代婚恋交友的挑战 传统婚恋交友方式存在诸多限制&#xff0c;如地理距离、社交圈子的局限性&…

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

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

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

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

[Linux安全运维] Linux命令相关

Linux命令相关 文件操作命令 相关操作说明ls列出当前目录的文件和子目录cd切换到指定目录pwd显示当前工作目录的路径mkdir创建新目录rmdir删除空目录rm删除文件或目录cp复制文件或目录mv移动或重命名文件或目录touch创建一个新的空文件cat显示文件内容more分页显示文件内容le…

Python 文档字符串(DocStrings)是个啥??

背景 最近在开发过程中&#xff0c;突然发现还有一个东西叫做文档字符串的玩意&#xff0c;原来函数的注释还能这么用&#xff1f;&#xff1f;python再次刷新了我的认知。以前函数注释我都是写在函数之前&#xff0c;现在看来&#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…

SQL Server中设置端口号

在SQL Server中设置端口号可以通过SQL Server配置管理器进行。以下是具体步骤&#xff1a; 使用SQL Server 配置管理器设置端口 打开SQL Server配置管理器&#xff1a; 在Windows开始菜单中搜索“SQL Server 配置管理器”&#xff0c;然后打开它。 配置SQL Server网络配置&…

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;它的意义不仅在…

【前端】技巧 js 监听所有A标签 拦截 用于安全跳转等

【前端】技巧 监听所有A标签 拦截 用于安全跳转等 监听a标签() 如果有动态的a标签 可以生成动态a标签之后 再执行这个方法 function 监听a标签(){// 获取所有的 <a> 标签const links document.querySelectorAll(a);// 遍历每个 <a> 标签&#xff0c;并添加点击事件…

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

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

ARCGIS PRO SDK 选择对象Dictionary的操作

一、SelectionSet的成员 SelectionSet的3个主要成员&#xff1a; 1、Count&#xff1a;获取选择集中记录的总数。返回的是一个int值。 2、isEmpty&#xff1a;判断当前选择集是否为空。返回的是一个bool值。 3、item&#xff1a;获取成员对象 ID的列表。返回的是一组long值。 二…