在算法导论有一道非常有趣的证明题, 利用2个队列实现一个栈, 队列和栈最大的区别就是队列满足FIFO(先进先出),他有2个操作的地方,一个是队头一个是队尾,
而栈满足的是先进后出,他只有一个操作的地方就是栈顶。
我们定义
2
个队列
queue1 queue2 用于存放进"栈"
用queue2临时存
放queue1的数据。
那么实现他的方式就比较明显了, 首先我们先抽象的想象一下,我们封住队列的一个一端,元素进“栈”的话,直接让他进去queue1队列
对于出“栈”,把queue1的除开最后一个元素的其余的元素转移到queue2中 ,然后把刚才剩下queue1中的那个元素出队列(Stack.pop)。之后把q2中的全部元素转移回q1中。
比如queue1中有三个数据c b a. 那么我们把除开最后一个c以外的2个元素 b, a元素移到queue2. 如果这个时候用户出栈的话,
那么请问是不是就只有c了? c就是栈顶。 c pop出去, 接着如果在执行出栈的话,我们在把queue2中除最后一个元素的元素
移到queue1 请问是不是只有b了? 那么执行pop就是出去b。
下面给出Java实现代码:
import java.util.Queue;
public class Test_Queue {
Queue<integer> queue1 = new ArrayDeque<>();
Queue<integer> queue2 = new ArrayDeque<>();
public void push(int node) {
//两个栈都为空时,优先考虑queue1
if (queue1.isEmpty()&&queue2.isEmpty()) {
queue1.add(node);
return;
}
//如果queue1为空,queue2有元素,直接放入queue2
if (queue1.isEmpty()) {
queue2.add(node);
return;
}
if (queue2.isEmpty()) {
queue1.add(node);
return;
}
}
public int pop() {
//两个栈都为空时,没有元素可以弹出
if (queue1.isEmpty()&&queue2.isEmpty()) {
try {
throw new Exception(stack is empty);
} catch (Exception e) {
}
}
//如果queue1为空,queue2有元素, 将queue2的元素依次放入queue1中,直到最后一个元素,我们弹出。
if (queue1.isEmpty()) {
while (queue2.size()>1) {
queue1.add(queue2.poll());
}
return queue2.poll();
}
if (queue2.isEmpty()) {
while (queue1.size()>1) {
queue2.add(queue1.poll());
}
return queue1.poll();
}
return (Integer) null;
}
public static void main(String[] args) {
Test_Queue test_Queue = new Test_Queue ();
test_Queue.push(9);
test_Queue.push(8);
test_Queue.push(7);
test_Queue.push(6);
System.out.println(test_Queue.pop());
System.out.println(test_Queue.pop());
demo08.push(5);
System.out.println(test_Queue.pop());
System.out.println(test_Queue.pop());
System.out.println(dtest_Queue.pop());
}