持续创作,加速成长!这是我参与「掘金日新计划 · 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的时候将队列头部的元素,也就是除了最后一个元素的元素,重新添加到队列末尾即可。