< 每日算法 - 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技巧 ) >

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术宅小温

你小小的鼓励,是我搬砖的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值