深入探讨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 = -Infinity
        for (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.length
    const 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.mfbz.cn/a/773001.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接口测试工具Postman

Postman Postman介绍 开发API后&#xff0c;用于API测试的工具。在我们平时开发中&#xff0c;特别是需要与接口打交道时&#xff0c;无论是写接口还是用接口&#xff0c;拿到接口后肯定都得提前测试一下。在开发APP接口的过程中&#xff0c;一般接口写完之后&#xff0c;后端…

78110A雷达信号模拟软件

78110A雷达信号模拟软件 78110A雷达信号模拟软件(简称雷达信号模拟软件)主要用于模拟产生雷达发射信号和目标回波信号&#xff0c;软件将编译生成的雷达信号任意波数据下载到信号发生器中&#xff0c;主要是1466-V矢量信号发生器&#xff0c;可实现雷达信号模拟产生。软件可模…

TensorRT-Int8量化详解

int8量化是利用int8乘法替换float32乘法实现性能加速的一种方法 对于常规模型有&#xff1a;y kx b&#xff0c;此时x、k、b都是float32, 对于kx的计算使用float32的乘法 对于int8模型有&#xff1a;y tofp32(toint8(k) * toint8(x)) b&#xff0c;其中int8 * int8结果为in…

SpringBoot的热部署和日志体系

SpringBoot的热部署 每次修改完代码&#xff0c;想看效果的话&#xff0c;不用每次都重新启动代码&#xff0c;等待项目重启 这样就可以了 JDK官方提出的日志框架&#xff1a;Jul log4j的使用方式&#xff1a; &#xff08;1&#xff09;引入maven依赖 &#xff08;2&#x…

头歌资源库(20)最大最小数

一、 问题描述 二、算法思想 使用分治法&#xff0c;可以将数组递归地分割成两部分&#xff0c;直到数组长度为1或2。然后比较这两部分的最大、次大、次小、最小数&#xff0c;最终得到整个数组中的最大两个数和最小两个数。 算法步骤如下&#xff1a; 定义一个函数 findMinM…

uniapp/Android App上架三星市场需要下载所需要的SDK

只需添加以下一个权限在AndroidManifest.xml <uses-permission android:name"com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>uniapp开发的&#xff0c;需要在App权限配置中加入以上的额外权限&#xff1a;

Generative Modeling by Estimating Gradients of the Data Distribution

Generative Modeling by Estimating Gradients of the Data Distribution 本文介绍宋飏提出的带噪声扰动的基于得分的生成模型。首先介绍基本的基于得分的生成模型的训练方法&#xff08;得分匹配&#xff09;和采样方法&#xff08;朗之万动力学&#xff09;。然后基于流形假…

2024 年 亚太赛 APMCM (B题)中文赛道国际大学生数学建模挑战赛 |洪水灾害数据分析 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 该段文字…

HTML内容爬取:使用Objective-C进行网页数据提取

网页爬取简介 网页爬取&#xff0c;通常被称为网络爬虫或爬虫&#xff0c;是一种自动浏览网页并提取所需数据的技术。这些数据可以是文本、图片、链接或任何网页上的元素。爬虫通常遵循一定的规则&#xff0c;访问网页&#xff0c;解析页面内容&#xff0c;并存储所需信息。 …

自动化立体仓库出入库能力及堆垛机节拍

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 自动化立体仓库的出入库能力、堆垛机节拍以…

用720云搭建数字孪生VR智慧安防系统,赋能安防升级!

“安全防范"一直是我国城镇化发展进程中重点关注的工作板块&#xff0c;随着时代发展需求与科技的日新月异&#xff0c;安防行业正在积极融合VR3D数字孪生技术&#xff0c;升级安防数字基础设施和安防产品服务创新。 今年2月&#xff0c;《数字中国建设整体布局规划》的出…

Pycharm的终端(Terminal)中切换到当前项目所在的虚拟环境

1.在Pycharm最下端点击终端/Terminal, 2.点击终端窗口最上端最右边的∨&#xff0c; 3.点击Command Prompt&#xff0c;切换环境&#xff0c; 可以看到现在环境已经由默认的PS(Window PowerShell)切换为项目所使用的虚拟环境。 4.更近一步&#xff0c;如果想让Pycharm默认显示…

macOS使用Karabiner-Elements解决罗技鼠标G304连击、单击变双击的故障

记录一下罗技鼠标G304单击变双击的软件解决过程和方案&#xff08;适用于macOS&#xff0c; 如果是Windows&#xff0c;使用AutoHotKey也有类似解决办法、方案&#xff0c;改日提供&#xff09;&#xff1a; 背景&#xff1a;通过罗技Logitech G HUB软件对罗技的游戏鼠标侧键b…

1-4 NLP发展历史与我的工作感悟

1-4 NLP发展历史与我的工作感悟 主目录点这里 第一个重要节点&#xff1a;word2vec词嵌入 能够将无限的词句表示为有限的词向量空间&#xff0c;而且运算比较快&#xff0c;使得文本与文本间的运算有了可能。 第二个重要节点&#xff1a;Transformer和bert 为预训练语言模型发…

2024 世界人工智能大会暨人工智能全球治理高级别会议全体会议在上海举办,推动智能向善造福全人类

2024 年 7 月 4 日&#xff0c;2024 世界人工智能大会暨人工智能全球治理高级别会议-全体会议在上海世博中心举办。联合国以及各国政府代表、专业国际组织代表&#xff0c;全球知名专家、企业家、投资家 1000 余人参加了本次会议&#xff0c;围绕“以共商促共享&#xff0c;以善…

搜维尔科技:如何使用 SenseGlove Nova 加速手部运动功能的恢复

District XR 的VR 培训 5 年多来&#xff0c;District XR 一直在为最大的工业公司创建 VR 和 AR 项目。 客户&#xff1a;District XR 客户代表&#xff1a;尼古拉沃尔科夫 他的角色&#xff1a;District XR 首席执行官 面临解决的挑战 该公司正在寻找一种方法来加速身体伤…

JavaScript——while类型

目录 任务描述 相关知识 while类型 编程要求 任务描述 质数的定义如下&#xff1a;大于1的自然数&#xff0c;且除了1和本身外没有别的因数。如2、3、5、7。 本关任务&#xff1a;利用循环结构求质数的和。 相关知识 在选择结构中&#xff0c;条件会被测试一次&#xff…

JAVA进阶学习10

文章目录 一、创建不可变集合二、Stream流2.1 Stream流的获取2.1 Stream流的中间方法2.2 Stream流的终结方法 一、创建不可变集合 意义&#xff1a;如果一个集合中的数据在复制或使用过程中不能修改&#xff0c;或者被其他对象调用时不能改变内部数据&#xff0c;即增加数据的安…

【靶机实战】Apache Log4j2命令执行漏洞复现

# 在线靶场 可以通过访问极核官方靶场开启靶机实验&#xff1a;极核靶场 -> 漏洞复现靶场 -> Log4j2-RCE 原文&#xff1a;【靶机实战】Apache Log4j2命令执行漏洞复现 - 极核GetShell (get-shell.com) # 简介 Apache Log4j2 是一个广泛使用的 Java 日志记录库&#…