剑指 Offer 09. 用两个栈实现队列
难度:简单
语言:JavaScript
题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail
和 deleteHead
,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead
操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:
-
1 <= values <= 10000
-
最多会对 appendTail、deleteHead 进行 10000 次调用
结果
代码实现
var CQueue = function() {
// 双栈实现队列的意思就是不可以使用 shift() 和 unshift()
// 只能通过 push() 和 pop() 实现
this.stack1 = [];
this.stack2 = [];
};
/**
* @param {number} value
* @return {void}
*/
CQueue.prototype.appendTail = function(value) {
this.stack1.push(value);
return null;
};
/**
* @return {number}
*/
CQueue.prototype.deleteHead = function() {
if(!(this.stack1.length||this.stack2.length)) return -1; // 两个栈都空了才返回 -1
if(!this.stack2.length) {
// 只有每次 (出栈)stack2 空了,才将 (入栈)stack1 中的元素加入到 stack2
// 这样才可以保证 队列的 特性: 先进先出
while(this.stack1.length) {
let val = this.stack1.pop();
this.stack2.push(val);
}
}
return this.stack2.pop();
};
/**
* Your CQueue object will be instantiated and called as such:
* var obj = new CQueue()
* obj.appendTail(value)
* var param_2 = obj.deleteHead()
*/
CQueue.prototype.deleteHead 未优化前的版本
CQueue.prototype.deleteHead = function(){
// 不太好的一版,比较笨拙
// 只看stack1是否为空,如果为空就返回-1
if(!(this.stack1.length)) return -1;
if(this.stack1.length){
// 如果stack1不为空,就将除了头部的整数外的其他整数循环出栈,入栈到stack2中
while(this.stack1.length-1){
let val1 = this.stack1.pop();
this.stack2.push(val1);
}
// 将stack1中的头部整数出栈赋值给val2,以便最后输出
let val2 = this.stack1.pop();
// 最后将stack2中的剩余整数循环(出栈)返回给stack1,以便后续调用时计算stack1是否为空
while(this.stack2.length){
let val3 = this.stack2.pop();
this.stack1.push(val3);
}
return val2;
}
};