题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
题解:
var CQueue = function() {
this.stackA = [];
this.stackB = [];
// 创建两个栈,A表示直接操作app函数,B用来操作dele函数
};
CQueue.prototype.appendTail = function(value) {
this.stackA.push(value);
//用function来传入参数,用push直接加在A函数尾部,加入数据完成
};
CQueue.prototype.deleteHead = function() {
// 因为是删除,所以function没有参数
if(this.stackB.length){
// 如果B栈中有数据,则直接将B中的最后一个参数删除,B中的最后一个参数,也就是A栈中的第一个参数,等同于将数据中的头部数据删除
return this.stackB.pop();
// .pop是删除数组的最后以后个元素,并且返回删除元素的值
}else{
// else表示B栈中没有数据了,
while(this.stackA.length){
this.stackB.push(this.stackA.pop());
// 将A中的数据删除,由于.pop删除方法会返回删除数据,所以用push()函数,将删除参数以返回值的方式加入B数组,由于pop是删除最后一个,所以将A中的数据全部加入B中时,依旧是头部数据在B栈的栈顶,删除时依旧可以用.pop方法来实现deleteHead()方法
}
if(!this.stackB.length){
// 将A中的数据放置B中,再判断B中有没有数据,此时如果为false,说明队列中已经没有数据了,根据题意,返回-1
return -1;
}else{
// 此时B中有A中传过来的数据,直接执行.pop()函数,
return this.stackB.pop();
}
}
};