问题
如何使用两个队列来高效的实现一个栈
解答
假设用来实现栈的两个队列分别为Q1和Q2,只需为栈定义入栈和出栈操作
入栈(push):
在任何一个非空队列中插入元素
检查队列Q1是否非空,如果Q1为空,对Q2执行入队操作
否则对Q1执行入队操作
时间复杂度O(1)
出栈(POP):
将N-1个元素移到另一个队列,删除当前队列中的最后一个元素完成出栈操作
如果队列Q1非空,那么从Q1移n-1个元素到Q2中,然后对Q1中的最后一个元素执行出队操作并返回该元素
如果队列Q2非空,那么从Q2移n-1个元素到Q1中,然后对Q2的最后一个元素执行出队操作并返回该元素
时间复杂度O(N)
代码
/**
* 用两个队列实现栈
*/
public class StackWithTwoQueue {
DynArrayQueue queue1;
DynArrayQueue queue2;
public StackWithTwoQueue() {
queue1 = new DynArrayQueue();
queue2 = new DynArrayQueue();
}
public void push(int data) {
if (queue1.isEmpty()) {
queue2.enQueue(data);
} else {
queue1.enQueue(data);
}
}
public int pop() {
int i = 0;
int size = 0;
if (queue2.isEmpty()) {
size = queue1.getQueueSize();
while (i < size - 1) {
queue2.enQueue(queue1.deQueue());
i++;
}
return queue1.deQueue();
} else {
size = queue2.getQueueSize();
while (i < size - 1) {
queue1.enQueue(queue2.deQueue());
i++;
}
return queue2.deQueue();
}
}
}