🌈【LeetCode.两个栈实现队列】- JavaScript =>模拟

238 阅读2分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


题意描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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的最后,然后最先被取出,这样就符合了队列先进先出的标准;

步骤分析:

  1. 初始化两个栈,第一个栈保持出口为队列尾部,只进不出第二个栈保持出口为队列头部,只出不进;
  2. 入队列时,如果第一个栈长度不等于元素总数,说明元素都在第二个栈,这个时候需要将第二个栈元素复制进来,然后再将元素入栈,长度加一
  3. 出队列时,如果第二个栈长度不等于元素总数,说明元素都在第一个栈,这个时候需要将第一个栈元素复制进来,然后再将元素出栈,长度减一
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();
};


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤