题目:
用两个队列来实现一个栈,完成栈的Push和Pop操作。栈中的元素为int类型。
分析:
(1)清楚队列和栈的特性:栈--先进后出;队列--先进先出。
(2)知道java中实现队列的方式:Queue接口,LinkedList实现类。
(3)操作过程难以理解的话,结合队列与栈的图例进行分析。
刚开始,入栈的元素添加到第一个队列中,当需要出栈的时候,发现此时能弹出的元素只有第一个,而栈需要的是最后一个,因此需要将元素倒入第二个队列中,此时如果全部倒入,相当于第二个队列的顺序和之前第一个顺序完全相同(如,队列1中的1,2,3,全部倒入队列2中,还是1,2,3)。这里需要变通一下,要弹出的元素是最后一个,那就将第一个队列中的元素倒入n-1个,最后一个弹出,不倒入另一个队列。此时,弹出最后一个元素后有一个空的队列。至此出栈可以实现。
入栈还需要注意,如果向两个栈模拟一个队列一样,始终在一个队列里将元素加入,再出栈的时候倒入另一个队列次序就改变了。因此需要将每次加入元素时加入到不为空的队列中。
实现:
public class test_7 {
LinkedList<Integer> queue1 = new LinkedList<Integer>();
LinkedList<Integer> queue2 = new LinkedList<Integer>();
public void push(int node){
if(queue2.size()==0){
queue1.add(node);
}else
queue2.add(node);
}
public int pop(){
if(queue1.size()==0 && queue2.size()==0)
return -1;
if(queue2.size()==0){
while(queue1.size()>1){
queue2.add(queue1.remove());
}
return queue1.remove();
}else{
while(queue2.size()>1){
queue1.add(queue2.remove());
}
return queue2.remove();
}
}
}