假设使用栈 A 与栈 B 模拟队列 Q,A 为插入栈,B 为弹出栈,以实现队列 Q。
假设栈 A 和 B 都为空,可以认为栈 A 提供入队列的功能,栈 B 提供出队列的功能。
要入队列,入栈 A 即可,而出队列则需要分两种情况考虑:
(1)若栈 B 不为空,则直接弹出栈 B 的数据。
(2)若栈 B 为空,则依次弹出栈 A 的数据,放入栈 B 中,再弹出栈 B 的数据。
以上情况可以利用自定义栈来实现,也可以采用 Java 类库提供的 Stack 来实现,下面代码是采用 Java 内置的 Stack 来实现的:
import java.util.Stack;
public class MyQueueWithTwoStack<E> {
private Stack<E> s1 = new Stack<E>();
private Stack<E> s2 = new Stack<E>();
public synchronized void put(E e) {
s1.push(e);
}
public synchronized E pop() {
if(s2.isEmpty()) {
while(!s1.isEmpty()) {
s2.push(s1.pop());
}
}
return s2.pop();
}
//判断队列是否为空,只有当两个栈都为空时,队列为空,否则,队列不为空
public synchronized boolean empty() {
return s1.isEmpty() && s2.isEmpty();
}
public static void main(String[] args) {
MyQueueWithTwoStack<Integer> q = new MyQueueWithTwoStack<Integer>();
q.put(3);
q.put(2);
q.put(4);
System.out.println("队首元素:" + q.pop());
System.out.println("队首元素: " + q.pop());
System.out.println("队列是否为空: " + q.empty());
}
}
引申: 如何使用两个队列实现栈?
假设使用队列 q1 与 队列 q2 模拟栈 S,q1 为入队列,q2 为出队列。
实现思路: 可以认为队列 q1 提供压栈的功能,队列 q2 提供弹栈的功能。
要压栈,入队列 q1 即可,而弹栈时,出队列则需要分两种情况考虑:
(1)若队列 q1 中只有一个元素,则让 q1 中的元素出队列并输出即可。
(2)若队列 q1 中不止一个元素,则队列 q1 中的所有元素出队列,入队列 q2,最后一个元素不入队列 q2,输出该元素,然后将队列 q2 所有元素入队列 q1.