上一篇写了连个栈实现一个队列 酒想到了两个队列实现一个栈
这个会比两个栈实现一个队列复杂一点 但是想明白了也很简单
利用一个空队列做为中转,将另一个队列只留最后一个元素 其他元素全部转移到这个空队列,然后剩下那个元素即为pop的元素
import java.util.ArrayDeque;
import java.util.Queue;
/**
* 两个队列实现一个栈
* 入队 offer 出队 poll
* 利用一个空队列作为中转队列 将size-1个元素插入到空队列中 pop出最后一个元素
* @author Administrator
*
*/
public class Queue2Stack {
private Queue queue1;
private Queue queue2;
public Queue2Stack(){
queue1 = new ArrayDeque<>();
queue2 = new ArrayDeque<>();
}
// 插入到非空的队列中
public void push(Object o){
if(queue2.isEmpty()){
queue1.offer(o);
}
else{
queue2.offer(o);
}
}
// pop出非空队列的最后一个元素
public Object pop(){
if(queue1.isEmpty() && !queue2.isEmpty()){
return swap(queue1,queue2);
}
else if(!queue1.isEmpty() && queue2.isEmpty()){
return swap(queue2,queue1);
}
return null;
}
/**
*
* @param q1 空队列
* @param q2 非空队列
* 将q2的前size-2个参数 插入q1
* @return q2的尾元素 即pop元素
*/
private static Object swap(Queue q1,Queue q2){
while(q2.size()!=1){
q1.offer(q2.poll());
}
return q2.poll();
}
public int size(){
return queue1.size()+queue2.size();
}
public static void main(String[] args) {
Queue2Stack qs = new Queue2Stack();
qs.push(1);
qs.push(2);
qs.push(3);
int size = qs.size();
for(int i=0;i<size;i++){
System.out.println(qs.pop());
}
}
}