leetcode232-用栈实现队列

877 阅读3分钟

开启leetcode刷题系列。大佬云:“刷算法就像做数学题,首先要学定义,然后记住公式,最后利用公式和总结的套路去做题“。

我也是个算法小菜鸡,但是算法对于我们程序员来说确实很重要。写文章主要是为了输出,把我刷题的思路记录下来也可以更方便的复盘。当然也希望我的思路对你们也有所帮助。下面开始行动吧!虽然不知道能不能坚持住,先动手再说吧,写了个专栏算法刷题感兴趣的同学可以联系我哦!

232. 用栈实现队列

我们首先看下题目

image.png

题目要求我们使用两个栈来实现一个先入先出的队列。我们知道栈是先入后出的。下面说一下这道题的思路,相信你听了之后一定会觉得很简单。

现在有两个栈l1 l2,入队列的时候,我们需要往l1中入,我们依次加入了a,b,c,那现在按照队列来讲,想要出列应该是要把a出队,但是此时a在栈中,按照栈来说,a只能最后一个出去

image.png

但是你别忘了,题目说使用两个栈实现一个队列,此时l2还是空着的。那我们如果把l1中的元素依次出栈,然后再依次的推入l2,现在是不是此时l2元素的栈顶是a了,然后再给l2出栈,这样就实现了队列出队的操作了。

image.png 上面就是用栈模拟队列出队的情况。入队就只需要往l1中推入即可。

代码演示

var MyQueue = function () {
  this.l1 = [];
  this.l2 = [];
};

MyQueue.prototype.push = function (x) {
  this.l1.push(x);
};

MyQueue.prototype.pop = function () {
  if (this.l2.length) {
    return this.l2.pop();
  } else {
    while (this.l1.length) {
      this.l2.push(this.l1.pop());
    }
    return this.l2.pop();
  }
};

MyQueue.prototype.peek = function () {
  if (this.l2.length) {
    return this.l2[this.l2.length - 1];
  } else {
    return this.l1[0];
  }
};

MyQueue.prototype.empty = function () {
  return !this.l2.length && !this.l1.length;
};

首先定义l1 l2两个栈。push的时候直接往l1中入栈即可。pop的时候,如果l2中有元素则l2直接出栈即可,如果没有元素则需要从l1中依次出栈,然后再往l2中依次入栈即可。peek为返回队列开头元素,如果l2中有元素,则l2中的栈顶元素就是队列的开头元素,如果l2中没有元素,则l1中的栈尾元素就是队列的开头元素。如果l1l2都没有元素则判定队列为空。

其实返回队列开头元素还有另一种实现方式

MyQueue.prototype.peek = function () {
  let x = this.pop()
  this.l2.push(x)
  return x
};

执行pop操作,弹出队列的开头元素,这个元素肯定就是队列的开头元素了,保存下来,然后再把值推入l2,然后返回保存的值即可。

总结

这道题难点在于如何利用栈的特性来实现队列的特性,相信上面图片的演示能够让你理解。

如果你懂了那就点个赞吧,如果你不懂,请把你的疑问放在评论区一起学习一起进步!!!