「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战」
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
思路分析
核心:
- 栈-后进先出,队列-先进后出。=> 两个栈组成一个队列,即一个栈负责存,一个负责输出;
- 栈1中首先被放入的元素,最后被取出放入栈2的最后,然后最先被取出,这样就符合了队列先进先出的标准;
步骤分析:
- 初始化两个栈,第一个栈保持出口为队列尾部,只进不出;第二个栈保持出口为队列头部,只出不进;
- 入队列时,如果第一个栈长度不等于元素总数,说明元素都在第二个栈,这个时候需要将第二个栈元素复制进来,然后再将元素入栈,长度加一
- 出队列时,如果第二个栈长度不等于元素总数,说明元素都在第一个栈,这个时候需要将第一个栈元素复制进来,然后再将元素出栈,长度减一
var CQueue = function() {
//两个栈,一个出栈,一个入栈
this.st1 = [];
this.st2 = [];
this.length = 0;//维护队列的长度
};
CQueue.prototype.appendTail = function(value) {
if(this.st1.length !== this.length){
while(this.st2.length){
this.st1.push(this.st2.pop());
}
}
this.st1.push(value);
this.length+=1;
};
CQueue.prototype.deleteHead = function() {
if(!this.length) return -1;
if(this.st2.length){
this.length -= 1;
return this.st2.pop();
}
for(var i = 0; i < this.length - 1; i++){
this.st2.push(this.st1.pop());
}
this.length -= 1;
return this.st1.pop();
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤