用双栈实现先进先出的队列
题目(力扣232题)
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
解答
- 为
MyQueue
类定义两个栈stack1、stack2
var MyQueue = function() {
this.stack1 = [];
this.stack2 = [];
};
push
操作直接通过栈的push方法加入栈stack1
MyQueue.prototype.push = function(x) {
this.stack1.push(x);
};
pop
操作从队列开头移除并返回元素,思路:先通过pop将stack1的数全部取出来然后再通过push放入stack2中,最后通过pop取出stack2的顶部元素并移除即可,但是注意,要先判断stack2中是否有元素,如果有元素,则直接通过pop取出stack2顶部元素并移除。
MyQueue.prototype.pop = function() {
if(!this.stack2.length){
while (this.stack1.length) {
this.stack2.push(this.stack1.pop());
}
}
return this.stack2.pop();
};
通过push存入了五个数:
通过pop取出开头元素,并移除:
第一种情况: stack2为空,先将stack1的元素全部依次取出并放进stack2中,再取出stack2顶部元素
第二种情况: stack2为非空,直接取出stack2顶部元素
peek
操作和pop
操作不同的是,不能通过pop取出stack2的顶部元素,因为pop会移除元素,所以通过指定下标来查找并返回顶部元素。
MyQueue.prototype.peek = function() {
if(!this.stack2.length){
while (this.stack1.length) {
this.stack2.push(this.stack1.pop());
}
}
return this.stack2[this.stack2.length - 1];
};
empty
操作:判断两个栈是否都为空,都为空则返回true,否则返回false
MyQueue.prototype.empty = function() {
return !this.stack1.length && !this.stack2.length;
};
转载自:https://juejin.cn/post/7367611991362306100