代码随想录算法训练营第十天 | 232.用栈实现队列、225. 用队列实现栈

60 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

232.用栈实现队列

分析题目

题目要求用两个栈实现先入先出队列,也就是使用先入后出的方式实现先入先出,这道题可以加深对栈与队列的理解。

解决

可以将两个栈分为进栈栈和出栈栈,当进队列的时候只需要将元素push进入进栈栈即可。出队列的时候由于是先入先出结构,所以要先判断出栈栈有没有元素,有的话直接pop,没有的话将进栈栈的元素pop后push入出栈栈中。

这里比较巧妙的是将进栈栈的元素pop出去后push进岀栈栈后出栈栈已具备先入先出的能力。

返回队列开头的元素可以复用pop的逻辑,只要将元素pop出去再push进去即可,判断队列是否为空,只需要判断进栈栈和出栈栈是否为空。

代码如下:

var MyQueue = function() {
    this.stackIn = []
    this.stackOut = []
};
MyQueue.prototype.push = function(x) {
    this.stackIn.push(x)
};
MyQueue.prototype.pop = function() {
    let len = this.stackOut.length
    if(len) return this.stackOut.pop()
    while(this.stackIn.length) this.stackOut.push(this.stackIn.pop())
    return this.stackOut.pop()
};
MyQueue.prototype.peek = function() {
    let x = this.pop()
    this.stackOut.push(x)
    return x
};
MyQueue.prototype.empty = function() {
    return !this.stackIn.length && !this.stackOut.length
};

总结

这道题目很简单,但理解起来最好通过动图的方式,一看图就能明白了。

225. 用队列实现栈

题目分析

这道题与上道题刚好相反,要求用两个队列实现一个后入先出的栈。这道题还是四种操作,只要实现出来就可以了。

解决

这个题目可以采用两个队列的方式实现,也可以采用一个队列的方式实现。

先来说一下两个队列的方法,使用两个队列也就是一个队列进行操作,一个队列用于备份第一个队列。push的时候直接push到第一个队列里,pop的时候将前面的元素备份到第二个队列,再pop出第一个队列的最后一个元素。这样就可以简单实现栈的功能。

但是这个题目还可以通过一个队列的方式实现,只需要在pop的时候将队列头部的元素,也就是除了最后一个元素的元素,重新添加到队列末尾即可。