[路飞]_一起刷leetcode 面试题 03.04. 化栈为队

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

面试题 03.04. 化栈为队

实现一个MyQueue类,该类用两个栈来实现一个队列。

示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false
复制代码

说明:

  • 你只能使用标准的栈操作 -- 也就是只有 push to toppeek/pop from topsize 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

思路

  1. 先给大家翻译一下题目,用两个栈实现一个队列的意思就是说:现在我们有两个数组,每次我们只能使用数组的pushpop操作,如何达到先push进去的元素可以pop出来;
  2. 那我们可以像拿两个桶装东西一样,先挨个放进第一个桶里,然后要拿出来之前,我们可以把第一个桶的东西挨个拿到第二个桶,然后第二个桶就可以依次拿到外面去了。

动画.gif

实现

var MyQueue = function() {
    // 进栈
    this.stackIn = [];
    // 待出栈
    this.stackOut = [];
};

// 放个东西进去
MyQueue.prototype.push = function(x) {
    this.stackIn.push(x);
};

// 拿出最先放进去的元素
MyQueue.prototype.pop = function() {
    if (this.stackOut.length === 0) {
        // 一个一个倒出来放进待出栈列表
        while (this.stackIn.length) {
            this.stackOut.push(this.stackIn.pop());
        }
    }
    return this.stackOut.pop();
};

// 获取最先放进去的元素,不拿出来
MyQueue.prototype.peek = function() {
    if (this.stackOut.length === 0) {
        // 一个一个倒出来放进待出栈列表
        while (this.stackIn.length) {
            this.stackOut.push(this.stackIn.pop());
        }
    }
    return this.stackOut[this.stackOut.length - 1];
};

// 兜里还有东西吗
MyQueue.prototype.empty = function() {
    return this.stackIn.length === 0 && this.stackOut.length === 0;
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * var obj = new MyQueue()
 * obj.push(x)
 * var param_2 = obj.pop()
 * var param_3 = obj.peek()
 * var param_4 = obj.empty()
 */
复制代码

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。

猜你喜欢

转载自juejin.im/post/7037090707680526366