今日题目:
- 232.用栈实现队列
- 225. 用队列实现栈
解题思想:
- 用栈实现队列
一个栈肯定实现不了队列,所以用两个栈,一个数入栈,一个输出栈。在push数据的时候,只要把数据放入输入栈即可,但是在pop的时候, 就要分情况讨论。如果输出栈为空,就需要把入栈数据全部导入,再从输出栈弹出数据。如果输出栈不为空,则直接从输出栈弹出数据
- 用队列来实现栈
可能刚开始会惯性思维需要两个队列才能实现栈,其实一个就够了。队列是先进先出的,可以每次把队列的元素从队头取出来后,再把它压入队尾,重复直到队内最后一个元素被弹出。
代码:
- 225 . 用队列实现栈
var MyQueue = function() {
this.stackIn = [] //输入栈
this.stackOut = [] //输出栈
};
MyQueue.prototype.push = function(x) {
this.stackIn.push(x)
};
MyQueue.prototype.pop = function() {
const size = this.stackOut.length
if(size) {
return this.stackOut.pop()
}
while(this.stackIn.length) {
this.stackOut.push(this.stackIn.pop())
}
return this.stackOut.pop()
};
MyQueue.prototype.peek = function() {
const x = this.pop()
this.stackOut.push(x)
return x
};
MyQueue.prototype.empty = function() {
return !this.stackIn.length && !this.stackOut.length
};
- 225 . 用队列实现栈
var MyStack = function() {
this.queue = []
};
MyStack.prototype.push = function(x) {
this.queue.push(x)
};
MyStack.prototype.pop = function() {
let len = this.queue.length //关键是计算这轮需要弹出加入多少个元素
while(len-- >1) {
this.queue.push(this.queue.shift())
}
return this.queue.shift() //将队尾元素弹出,就是栈顶元素了
};
MyStack.prototype.top = function() {
const x = this.pop()
this.queue.push(x)
return x
};
MyStack.prototype.empty = function() {
return !this.queue.length
};
总结:
不管是用栈模拟队列,还是用队列模拟栈,关键点在于不破坏元素顺序,计算控制好每次要弹出的元素个数。用队列模拟栈,两个队列可以,一个队列也可以做到。