【Javascript】栈和队列的实现

2023-11-13

前言

我们知道栈的原理是先进后出,队列的原理是先进先出。

在JS中主要通过数组来实现队列和数组的功能。

首先我们来看栈

入栈可以用 arr.push()

出栈可以用 arr.pop()

然后是队列

入队可以用 arr.push()

出队可以用 arr.shift()


接下来通过两道经典的题目来进一步熟悉栈和队列

leetcode 232 用栈实现队列

题目链接
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty

主要思路:

我们需要用两个栈,一个负责入队stackIn,一个负责出队stackOut。

入队push()的时候,直接压入stackIn中即可,重点在于出队的操作。在pop()时如果stackOut为空,则将stackIn全部数据都导入stackOut,这样一来,stackOut栈顶元素就是第一个入栈的元素,也就是我们需要出队的元素。如果stackOut不为空,则直接出栈弹出数据即可。

判断队列是否为空,只需要stackIn和stackOut均为空即说明队列为空。

具体代码实现:

var MyQueue = function() {
    this.stackIn = [];
    this.stackOut = [];
};

/** 
 * @param {number} x
 * @return {void}
 */
MyQueue.prototype.push = function(x) {
    this.stackIn.push(x)
};

/**
 * @return {number}
 */
MyQueue.prototype.pop = function() {
    if(this.stackOut.length){
        return this.stackOut.pop();
    }
    while(this.stackIn.length !== 0){
        this.stackOut.push(this.stackIn.pop());
    }
    return this.stackOut.pop();
};

/**
 * @return {number}
 */
MyQueue.prototype.peek = function() {
    const x = this.pop();
    this.stackOut.push(x);
    return x;
};

/**
 * @return {boolean}
 */
MyQueue.prototype.empty = function() {
    return !this.stackIn.length && !this.stackOut.length;
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * var obj = new MyQueue()
 * obj.push(x)
 * var param_2 = obj.pop()
 * var param_3 = obj.peek()
 * var param_4 = obj.empty()
 */

leetcode 225 用队列实现栈

题目链接

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

主要思路:

由于队列是先进先出,这个题目肯定不能和leetcode232一样。但我们同样是使用两个队列queue1和queue2。queue2主要的作用其实是备份,存储最后一个“入栈”元素以外的所有元素。这样可以保证queue1中队首元素始终是栈顶元素。

入栈我们还是直接压入queue1即可。重点在于出栈操作,我们刚才也介绍过要做到栈顶元素就是queue1队首元素。因此 当queue1中元素个数大于1时,就将其pop()出去存储在queue2中。(这样可以保证que1中只有栈顶元素)。这里需要注意的一点是,如果已经出栈一次,queue1就会为空,此时我们需要将queue1与queue2进行交换。(如果交换后queue1元素个数大于1,会重复之前的操作)。

具体代码实现:

var MyStack = function() {
    this.queue1 = [];
    this.queue2 = [];
};

/** 
 * @param {number} x
 * @return {void}
 */
MyStack.prototype.push = function(x) {
    this.queue1.push(x);
};

/**
 * @return {number}
 */
MyStack.prototype.pop = function() {
    if(!this.queue1.length){
        [this.queue1, this.queue2] = [this.queue2, this.queue1];
    }
    while(this.queue1.length > 1){
        this.queue2.push(this.queue1.shift());
    }
    return this.queue1.shift();
};

/**
 * @return {number}
 */
MyStack.prototype.top = function() {
    const x = this.pop();
    this.queue1.push(x);
    return x;
};

/**
 * @return {boolean}
 */
MyStack.prototype.empty = function() {
    return !this.queue1.length && !this.queue2.length;
};

/**
 * Your MyStack object will be instantiated and called as such:
 * var obj = new MyStack()
 * obj.push(x)
 * var param_2 = obj.pop()
 * var param_3 = obj.top()
 * var param_4 = obj.empty()
 */

栈和队列还有许多经典的题目,如:leetcode 20 有效的括号leetcode 150 逆波兰表达式求值,感兴趣的朋友也可以自己尝试做一下, 巩固自己对栈和队列的理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Javascript】栈和队列的实现 的相关文章

随机推荐

  • system.data.sqlite的源代码下载

    帮助文档 http system data sqlite org index html doc trunk www index wiki 历史版本https system data sqlite org index html doc tru
  • Kendo UI开发教程(14): Kendo MVVM 数据绑定(三) Click

    Click绑定可以把由ViewModel定义的方法不绑定到目标DOM的click事件 当点击目标DOM元素时触发ViewModel的对应方法 例如 使用Click绑定 1
  • Redis有序集合和定时任务解决订单15分钟关闭

    直接上代码 下单减去库存 public String updatePersonStock PageData pd throws Exception Map
  • IPSec协议

    内容提要 Motivation IP协议的安全缺陷 虚拟专用网 IPSec概述 协议流程 SPD SAD 数据封装 IPSec AH IPSec ESP 安全参数协商 ISAKMP IKE 一 Motivation 1 1IP协议的安全缺陷
  • Google Chrome 扩展程序

    Adblock Plus 扩展网址 https chrome google com webstore detail adblock plus free ad bloc cfhdojbkjhnklbpkdaibdccddilifddb 官网
  • uni-app底部导航栏tabBar监听变化以及变换样式

    一 简介 tabBar有三项 点击后两项变换tabBar的样式 二 案例演示 三 代码 1 首先 监听tabBar 点击切换 放在这三个页面 和onLoad同级 页面生命周期onTabItemTap 监听 TabBar 切换点击 onTab
  • SQL计算复购率

    需求背景 订单表中有每笔订单的下单时间 用户ID 订单金额等信息 需要统计每个月在接下来几个月用户复购情况 create table order info order id int primary key user id int amoun
  • CSS样式表中的基本选择器

    样式表中的选择器 作用 用于选则控件 设置样式 常用的样式选择器 一 基础样式选择器 1 id选择器 用 来选择 ps id是唯一的不允许重复 id的名称 样式 值 给id为指定名称的控件 设置样式 css代码如下
  • SQL:开窗排序,在order by 后加判断条件的作用是什么?

    场景 在生产中 经常会看到窗口函数中对排序字段加 is not null 判断 类似这样的sql代码 select row number over partition by id order by amount 1 is not null
  • Python 学习笔记

    1 函数 2 其他 未完待续 1 函数 append 在列表末尾添加一个元素 list append item count 计算指定元素在列表 字符串或元组中出现的次数 for i in uniqueArr nums append arr
  • Weblogic远程代码执行漏洞 CVE-2023-21839

    漏洞简介 WebLogic Core远程代码执行漏洞 CVE 2023 21839 该漏洞允许未经身份验证的远程攻击者通过T3 IIOP协议进行 JNDI lookup 操作 破坏易受攻击的WebLogic服务器 成功利用此漏洞可能导致Or
  • C语言实验(十四):指针(数组排序,数组求平均数、中位数和众数)

    C语言实验 十四 指针 数组排序 数组求平均数 中位数和众数 一 输入10个整数 利用指针分别由小到大排序 由大到小排序 二 输入10个整数 通过指针引用数组 实现三个函数 分别求这10个整数的平均值 中位数 中值 数组名作为函数参数 通过
  • 人机融合的经验与人类的或机器的经验不同

    一 人机融合的经验与人 机器的经验有所不同 人的经验是通过感知 学习思考等方式积累起来的 是基于我们的感官 情感和意识等特点所形成的 人在与世界交互的过程中 通过观察事物 从错误中学习 与他人交流等方式逐渐积累了大量的经验 人类的经验通常包
  • Ubuntu16.04搭建FTP服务器

    1 vsftpd sudo apt get update sudo apt get install vsftpd 2 检查是否安装成功 vsftpd version 二 修改配置文件 1 修改vsftpd conf文件内容 sudo vim
  • ASCII码详解

    ASCII码表 ASCII码大致可以分作三部分組成 第一部分是 ASCII非打印控制字符 第二部分是 ASCII打印字符 第三部分是 扩展ASCII打印字符 第一部分 ASCII非打印控制字符表 ASCII表上的数字0 31分配给了控制字符
  • 切面更改入参

    定义一个注解 package com huaxia bigdata bi common annotation import com zeekr bigdata bi common constant Constant import com z
  • oracle 9i英文版下载,oracle9i各种版本的下载地址

    Oracle9i Database Release 2 Enterprise Standard Personal Edition for Windows NT 2000 XP http download oracle com otn nt
  • vue3切换路由模式——Hash 、histoary

    1 history模式 使用createWebHistory import createRouter createWebHistory from vue router import Home from views Home vue cons
  • ajax进度条视频缩略图,ajax 异步上传带进度条视频并提取缩略图.pdf

    ajax 异异步步上上传传带带进进度度条条视视频频并并提提取取缩缩略略图图 这篇文章主要介绍了ajax 异步上传带进度条视频并提取缩略图的相关资料 需要的朋友可以参考下 最近在 一个集富媒体功能于一身的项目 需要上传视频 这里我希望 成异步
  • 【Javascript】栈和队列的实现

    Js实现栈和队列 前言 leetcode 232 用栈实现队列 leetcode 225 用队列实现栈 前言 我们知道栈的原理是先进后出 队列的原理是先进先出 在JS中主要通过数组来实现队列和数组的功能 首先我们来看栈 入栈可以用 arr