< 每日算法 - JavaScript解析:用两个栈实现队列 >

news2024/11/14 18:31:28

在这里插入图片描述

每日算法 - JavaScript解析:用两个栈实现队列

  • 一、任务描述:
    • 拓展知识
  • 二、问题解析
  • 三、解决方案:
  • 参考文献
  • 往期内容 💨

一、任务描述:

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

大伙在解决算法题的时候 ,可能会因为题目不好理解,导致无法解读。接下来,翻译成前端可以理解的角度去实现:

题意为:

》 示例一:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]

输出:[null,null,3,-1]

解释:输出的结果其实就是 [CQueue(), appendTail(3), deleteHead(), deleteHead()]

输出的第一个数组指要执行的方法
输入的第二个数组表示给对应方法传的参数
[
    CQueue(), // null, 初始化队列,返回 null,也就是啥也 return 就行了
    appendTail(3), // null,往队列尾部插入3,插入的操作也是啥都不 return
    deleteHead(), // 3,删除掉队列的头部一个成员,此时队列中只有一个 3, return 删掉的 3
    deleteHead() // -1,此时队列里没有成员,所以根据题意,让 deleteHead() return -1
]

拓展知识

1. 栈的概念
栈是一种后进先出(Last in First Out)的数据结构,简称 LIFO。

啥叫后进先出呢?这就和手枪从上子弹到发射子弹的步骤一样,弹夹中最先插进去的子弹最后才打出去,越晚摁进去的子弹越早被打出来,也就是入栈和出栈。

别小看它,栈是一种很重要的编程概念,它在软件应用中很常见。我们每天都用到的浏览器就用到了,浏览器的“后退”按钮也是如此。

2. 队列的概念
队列是一种先进先出(First in First Out)的数据结构,简称 FIFO。

啥叫先进先出呢?这就和排队上厕所,谁先到谁先嘘嘘,到的晚的只能忍住。

同比栈,队列在软件应用中也很常见,就像现在我在一个字母一个字母的敲,最后输出在屏幕上你看到的一个个的字,这些就是最常见的队列的应用。


二、问题解析

然后根据上面的内容,分析这个要求:用两个栈实现这个队列

栈的特点是,先进后出,如果用数组实现的话,就只能调用 pushpop

队列的特点是,先进先出,如果用数组实现的话,就只能调用 push 和 shift

目标就是两个只能用 push 和 pop 的数组(栈)实现队列的 appendTail(其实就是 push) 和 deleteHead(其实就是 shift)

其实就是借助一个栈存储倒序的一个正常栈,图解如下:

在这里插入图片描述
基本逻辑就出来了,最后输出栈2的内容,即为一个先进先出的队列。

三、解决方案:

var CQueue = function() {
  // 图解中的栈1
  this.inStack = []
  // 图解中的栈2
  this.outStack = []
};

/** 
 * @param {number} value
 * @return {void}
 */
CQueue.prototype.appendTail = function(value) {
  // 入栈
  this.inStack.push(value)
};

/**
 * @return {number}
 */
CQueue.prototype.deleteHead = function() {
  // 检测栈2是否为空,不为空则出栈栈2内容(此时栈2为倒序内容,栈2正常出栈为队列先进先出的规则)
  if (this.outStack.length) return this.outStack.pop();
  // 倒序栈1存储至栈2
  while (this.inStack.length) this.outStack.push(this.inStack.pop());
  // 如果没有内容则返回-1
  return this.outStack.pop() || -1
};

参考文献

图解!栈和队列,看了就会了!- 作者:Rocky0429

往期内容 💨

🔥 < CSS小技巧:filter滤镜妙用>

🔥 < JavaScript技术分享: 大文件切片上传 及 断点续传思路 >

🔥 < 每日技巧: JavaScript代码优化 >

🔥 < 每日知识点:关于Javascript 精进小妙招 ( Js技巧 ) >

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

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

相关文章

JS扩展运算符(...)的用法

参考链接: 本文可以说是完全抄写的参考链接的内容,本文的目的只用于自己进行记录,加深理解。原文参考链接 一、定义: 扩展运算符(...)是ES6的新增语法,用于取出参数对象中的所有可遍历属性,然后拷贝到当前…

vue移动端适配方案

一、基于rem的适配方案 rem是什么? rem是指相对于根元素的字体大小的单位,在日常开发过程中我们通常把根元素(html/body)的字体设置为10px,方便于我们计算(此时子元素的1rem就相当于10px)。 适用场景 不…

开学季,给上小学的孩子送什么比较好?小学生比较实用的礼物

很快来临开学的日子,对于上小学的孩子们,送写学习用具之类,或者是孩子自身喜欢的玩具也可以的,但是因为大部分小朋友在学习时都会眨眼睛,也有些近视的现象了,所以我会选择送护眼的用具比较合适的&#xff0…

DBCO-SS-NHS;CAS NO:1435934-53-4 二苯并环辛炔-二硫键-活性酯,科研实验用试剂

DBCO-SS-活性酯|DBCO-SS-NHS酯 名称;二苯并环辛炔-二硫键-活性酯;DBCO-SS-NHS CAS NO:1435934-53-4 分子量:565.66 分子式:C28H27N3O6S2 含 量:>95% 用 途:仅供科研实验使用,不用于诊治…

Kettle(三)数据写入错误如何处理?

Kettle作为数据治理工具,总是会涉及到数据的搬迁,在原始数据过大、种类过多时写入肯定会出现一些错误(缺少必填项、数据格式错误、主键冲突等等),那么Kettle如何解决?其实Kettle与我们自己写程序的思维不会…

从零开发一个非常有意思的 Python 项目:手势识别

最近开发了一个手势处理的项目(零基础也可以学,就是针对零基础的),我在这儿简单的复述一下原理,总体来说还是比较简单的,主要运用的知识就是opencv,python基本语法,图像处理基础知识…

OCR文字识别技术

OCR全称是optical character recognition,中文光学字符识别。主要技术是:把图像形状转变为文本字符。简单来说,OCR技术就是通过图像处理和模式识别技术对光学的字符进行识别,即,对文本资料进行扫描,然后对图…

呕心沥血保姆级Fiddler移动端抓包

本篇文章,博主想使用通俗易懂的话语,让大家明白以下内容:什么是抓包哪些场景需要用到抓包Fiddler抓包的原理怎样使用Fiddler进行移动端抓包抓包包 (Packet) 是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。我们平常测试过…

PCI设备的访问方法_非桥设备(type0)

PCI设备的访问方法_非桥设备(type0) 文章目录PCI设备的访问方法_非桥设备(type0)一、硬件结构二、 PCI本地总线的信号三、 访问PCI设备3.1 怎么访问PCI设备3.1 PCI设备的地址空间3.2 访问PCI设备的步骤3.3 示例:配置PCI Agent设备致谢一、硬件结构 PCI系统框图&…

2023年第七届航空航天、机械与机电工程国际会议(CAMME 2023)

2023年第七届航空航天、机械与机电工程国际会议(CAMME 2023) 重要信息 会议网址:www.camme.org 会议时间:2023年5月26-28日 召开地点:中国西安 截稿时间:2023年4月26日 录用通知:投稿后2周内 收录检索:EI,S…

ORA-01691: unable to extend lob segment

报错信息: ORA-01691: unable to extend lob segment YUNYAO.SYS_LOB0000152921C00013$$ by 1024 in tablespace USERS 针对此问题查了一些文章,排查到原因是表空间“USERS”的数据文件满了,到达最大值。 可能会出现的原因如下&#xff1a…

【Linux】gdb调试器

【Linux】gdb调试器 文章目录【Linux】gdb调试器1、调试器的意义2、gdb调试器介绍2.1 gdb的作用2.2 gdb的配置3、gdb调试器的使用3.1 常用调试命令3.2 调试前准备3.3 指令演示3.3.1 断点3.3.2 逐过程、逐语句3.3.3 查询变量3.3.4 跳转3.3.5 结束函数、跳出执行3.3.4 跳转3.3.5 …

Redis缓存穿透——实战代码教学,亲身体验高并发如何解决

🚀 注重版权,转载请注明原作者和原文链接 🥭 作者:全栈小袁 🍎 原创个人开源博客项目(目前V2.0微服务版本):https://github.com/yuanprogrammer/xiaoyuanboke 🍉 开源项目觉得还行的话点点star&…

Drain3改进的日志解析方法+代码

这本项目继承于https://github.com/logpai/Drain3 在此项目的基础上进行了改进,目前代码在PR阶段,感兴趣的可以从PR上拉取: 前言: 本项目继承于https://github.com/logpai/Drain3 在此项目的基础上进行了改进,目前代码…

【nv12 格式转换】不同图像数据格式之间转换代码实操

文章目录1 问题先行2 nv12介绍2.1 YUV格式2.2 NV12排布3 不同数据格式之间转换实操4 参考链接1 问题先行 nv12是什么格式?和常见的rgb/bgr有什么关系吗?他们之间能互相转换吗?如何读取一张图片,然后把图片转换成nv12格式&#xf…

liunx Reids哨兵模式+1主三从部署6.2.x

1.下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz2.解压 tar xzf redis-6.2.6.tar.gz 3.安装redis cd redis-6.2.6make && make install redis安装异常 安装gcc yum install gcc 检查gcc环境是否安装好rpm -qa|grep gcc 最后在安装redis m…

情人节适合送礼的数码好物有哪些?心意满满的数码好物清单

2023的情人节就快到了,各大数码品牌都已经摩拳擦掌。那么,情人节适合送礼的数码好物有哪些?下面,我来给大家推荐几款心意满满的数码好物,一起来看看吧。 一、蓝牙耳机 推荐产品:南卡小音舱 推荐理由&…

u盘为什么被写保护?u盘数据写保护如何恢复

u盘作为目前主流的数据存储辅助工具,能够存放各种重要数据。虽然u盘体积小巧使用方便,但是使用环节中也会存在各类问题,例如提示u盘写保护的情况。那么出现这种情况的原因是什么,如何解决u盘写保护问题以及写保护的u盘如何恢复数据…

Spring Cloud Gateway断言及过滤器使用

目录 1. 引入Spring Cloud Gateway 2. 核心概念 3. 工作原理 4. 配置路由断言工厂和网关过滤器工厂 5. 路由断言工厂 ​5.1 断言某个时间之后 5.2 断言某个时间之前 5.3 断言某个时间之间 5.4 根据cookie值断言 5.5 根据请求的标头断言 5.6 根据主机名来断言 5.7 根…

Java集合常见面试题(五)

Map 接口 ConcurrentHashMap 的实现原理 JDK 1.7 JDK1.7中的ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成,即ConcurrentHashMap 把哈希桶切分成小数组(Segment ),每个小数组有 n 个 HashEntry 组成。 其…