【正确答案】
【答案解析】假设使用栈A与栈B模拟队列Q,A为插入栈,B为弹出栈,以实现队列Q。
再假设A和B都为空,可以认为栈A提供入队列的功能,栈B提供出队列的功能。
要入队列,入栈A即可,而出队列则需要分两种情况考虑:
1)若栈B不为空,则直接弹出栈B的数据。
2)若栈B为空,则依次弹出栈A的数据,放入栈B中,再弹出栈B的数据。
以上情况可以利用前面介绍的栈来实现,也可以采用Java类库提供的Stack来实现,下面代码是采用Java内置的Stack来实现的:
public class MyQueue<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){
MyQueue<Integer>q=new MyQueue<Integer>();
q.put(1);
q.put(2);
System.out.println("队列首元素:"+q.pop());
System.out.println("队列首元素:"+q.pop());
}
}
程序运行结果为:
队列首元素:1
队列首元素:2
引申:如何使用两个队列实现栈?
假设使用队列q1与队列q2模拟栈S,q1为入队列,q2为出队列。
实现思路:可以认为队列q1提供压栈的功能,队列q2提供弹栈的功能。
要压栈,入队列q1即可,而当弹栈时,出队列则需要分两种情况考虑:
1)若队列q1中只有一个元素,则让q1中的元素出队列并输出即可。
2)若队列q1中不只一个元素,则队列q1中的所有元素出队列,入队列q2,最后一个元素不入队列B,输出该元素,然后将队列q2所有元素入队列q1。