用双栈实现先进先出的队列
题目(力扣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