二刷--用两个栈实现队列

222 阅读2分钟

题目描述

image.png

解题思路

  1. 一个栈用来模拟入队操作。
  2. 另一个栈用来模拟出队操作。
  3. 在构造函数的原型对象上添加增加队尾元素函数和删除队头元素函数,注意,这两个函数都不要使用箭头函数,因为涉及到this。
  4. 增加队尾元素只需直接在入队栈中入队即可。
  5. 删除队头元素则需进行如下判断
    • 出队栈中是否有元素,有则直接出栈
    • 入队栈中是否有元素
      • 有:将入队栈中的所有元素倒序加入到出队栈中,然后返回出队栈的栈顶元素。
      • 没有:返回-1.

AC代码

function CQueue() {
    // 模拟入队栈
    this.stackA = [];
    // 模拟出队栈
    this.stackB = []; 
}

/**
 * @description: 在队尾中添加元素
 * @param {*}
 * @return {*}
 */
CQueue.prototype.appendTail = function (value) {
    // 直接在入队栈中入队即可
    this.stackA.push(value);
}

CQueue.prototype.deleteHead = function() {
    // 首先判断出队栈中是否有元素,有则出栈
    if (this.stackB.length !== 0) {
        return this.stackB.pop();
    } 
    // 走到这里说明出队栈中没有元素,我们判断入队栈中是否有元素
    if (this.stackA.length !== 0) {
        // 把入队栈中的元素倒序加入出队栈  这是本题的解题核心
        while(this.stackA.length !== 0) {
            this.stackB.push(this.stackA.pop());
        }
        return this.stackB.pop();

    } else {
        return -1
    }
}

题目反思

本次遇到这个题目属于二刷了,这个题目是剑指offer的一道题目,第二次遇到也没有很顺利的做出来,本题的思路并不难,遇到的困难主要是我想使用箭头函数,但是因为本题涉及到了this指向的问题,箭头函数的this指向是看运行时的上下文环境的,所以导致报错,所以希望在以后的学习和工作中一旦涉及到this指向的问题,一定要考虑清楚箭头函数的问题。