声明:这是一道来自力扣的算法题,相关请登录该网站查看;
这里我们用js来解决以下问题
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
一。
首先我在这里做出一个解释;我们输入的这个数组里面的几个字符串,它是几个函数,第二行的数字是相对应的参数;
输出的则是 最后返回的值。
我们首先对这道题目进行分析,关键在于第一句话 用两个栈实现一个队列。
众所周知 栈是先进后出,队列是先进先出。
很显然这道题不仅仅只是考数学这么简单,它还涉及我们对于数据储存方式的了解。
1.栈 (先进后出)
可以理解为一个多层的高楼,然后我们往栈里面存值的时候,先住到楼顶那一层,
输出这个值的时候,它从最顶层搬走。
如果楼顶已经有值住了,再想存个新值的时候,原来的那个就会搬到下一层,楼顶住的永远都是新来的值。
然后楼顶的值搬走的时候,它下一层就会搬上来。
以此类推
2.队列 (先进先出)
也可以理解为一个多层的高楼,然后我们往栈里面存值的时候,先住到楼顶那一层,
再想存个新值的时候,这个新值就会自己住到下一层。
然后楼顶的值搬走的时候,它下一层就会搬上来。
以此类推
知道这些后,我们首先要解决的是 如何把两个栈变成一个队列
这里我们可以把一个栈当作是输入队列的一个工具,
另一个当作输出队列的一个工具。
3.用两个栈实现一个队列
首先假设两个栈为 A 和 B 。
向A输值 [1,2,3,4] 在A 中从上往下的结构是这样的[4,3,2,1]
然后把它依次输入到B
在B 中从上往下的结构就变成了这样的[1,2,3,4];
最后输出B中的这些值,我们把 从A到B的这个过程看作一个整体
就是输入了[1,2,3,4],输出了[1,2,3,4];先进先出 满足队列的要求。
二。
现在我们来看题目
var CQueue = function() {
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
};
/**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
};
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
CQueue是主函数,appendTail是输入函数,deleteHead是输出函数
输入函数输入了两个值5,2。在这之前输出函数被调用了一次,这个时候输出函数是没有值的,
因为输入函数还没有调用。所以输出的时候就输出了-1 符合题意(这一步要注意写在我们的输出函数里面)
然后输出了5,2。满足队列的先进先出。
三。
首先在主函数里面声明两个属性来当作栈来用。
var CQueue = function() {
this.stackA = [];
this.stackB = [];
};
然后是输入函数:
CQueue.prototype.appendTail = function(value) {
this.stackA.push(value);
};
我们这里是把值输入到这个栈内,输入操作完成。
开始写输出函数,
CQueue.prototype.deleteHead = function() {
if(this.stackB.length){
return this.stackB.pop();
}else{
}
};
如果 stackB 没有值的话,它的长度就为0 就不会输出了,而是把stackA的值传给stackB
if(this.stackB.length){
return this.stackB.pop();
}else{
while(this.stackA.length){ /*这里也是当stackA有值的时候就会 把stackA的值传给stackB*/
this.stackB.push(this.stackA.pop());
}
}
然后注意输出函数没有值的情况。输出-1
if(this.stackB.length){
return this.stackB.pop();
}else{
while(this.stackA.length){ /*这里也是当stackA有值的时候就会 把stackA的值传给stackB*/
this.stackB.push(this.stackA.pop());
}if(!this.stackB.length){
return -1;
}else{
return this.stackB.pop();
}
}
到这里就全部完成了。以下是完整过程:
var CQueue = function() {
this.stackA = [];
this.stackB = [];
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
this.stackA.push(value);
};
/**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
if(this.stackB.length){
return this.stackB.pop();
}else{
while(this.stackA.length){
this.stackB.push(this.stackA.pop())
}
if(!this.stackB.length){
return -1;
}else{
return this.stackB.pop();
}
}
};