如何使用两个栈模拟队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty);
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
分析
栈(Stack)特点:先进后出
队列(Queue)特点:现进先出
所以一个栈作为入队栈,一个栈作为出队栈
var MyQueue = function() {
// 入栈
this.stackA = [];
// 出栈
this.stackB = [];
};
/**
* Push element x to the back of queue.
* @param {number} x
* @return {void}
*/
MyQueue.prototype.push = function(x) {
this.stackA.push(x);
};
/**
* Removes the element from in front of queue and returns that element.
* @return {number}
*/
MyQueue.prototype.pop = function() {
if(this.stackB.length === 0){
while(this.stackA.length){
this.stackB.push(this.stackA.pop());
}
}
return this.stackB.pop()
};
/**
* Get the front element.
* @return {number}
*/
MyQueue.prototype.peek = function() {
if(!this.stackB.length){
return this.stackA[0];
}
else{
return this.stackB[this.stackB.length - 1];
}
};
/**
* Returns whether the queue is empty.
* @return {boolean}
*/
MyQueue.prototype.empty = function() {
return !this.stackA.length && !this.stackB.length
};
最大容量问题
用俩个栈模拟实现一个队列,如果栈的容量分别是O和P(O>P),那么模拟实现的队列最大容量是多少?
先给出结论:2P+1
,证明如下
分析
1、首先论述谁是容量较大的栈
如果stackA(入队栈)的容量为P;stackB(出队栈)的容量为O.O>P;
那么入队栈中的P个元素全部转移到出队栈后,还能再入队P个,所以最大容量为2P。
反之,如果stackA(入队栈)的容量为O;stackB(出队栈)的容量为P.O>P;
那么出队栈可以转移进去P个元素,入队栈还能再入队>P个(因为O>P),所以最大容量为>2P。
综上,stackA(入队栈)的容量为O;stackB(出队栈)的容量为P.
2、实现最大容量队列过程
① 第一批元素入队
不妨令P = 5 ,O > 5;
②首先第一批元素转移到出队栈、然后第二批元素入队
③ 首先第一批元素出队(P个)、然后第二批元素转移到出队栈(P个)
④首先入队栈中pop一个(!关键点)、然后第二批元素出队(P个)
⑤结束
至此,全部11个元素出队,一开始假设较少的容量为P = 5.
总结
两个栈的容量分别是O和P(O>P),那么模拟实现的队列最大容量是2P+1
.