每日算法 - JavaScript解析:用两个栈实现队列
- 一、任务描述:
- 拓展知识
- 二、问题解析
- 三、解决方案:
- 参考文献
- 往期内容 💨
一、任务描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,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。
啥叫先进先出呢?这就和排队上厕所,谁先到谁先嘘嘘,到的晚的只能忍住。
同比栈,队列在软件应用中也很常见,就像现在我在一个字母一个字母的敲,最后输出在屏幕上你看到的一个个的字,这些就是最常见的队列的应用。
二、问题解析
然后根据上面的内容,分析这个要求:用两个栈实现这个队列
栈的特点是,先进后出,如果用数组实现的话,就只能调用 push
和 pop
队列的特点是,先进先出,如果用数组实现的话,就只能调用 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技巧 ) >