使用两个队列模拟一个栈
准备笔试,在看相关知识,看到这个问题,如何使用两个队列模拟一个栈,在参考了相关知识下,实现了代码如下:
1 public class Stack<E>{ 2 Queue<E> q1 = null; //队列q1提供压栈功能, 3 Queue<E> q2 = null; //队列q2提供弹栈功能 4 5 public Stack(){ 6 q1 = new LinkedList<E>(); 7 q2 = new LinkedList<E>(); 8 } 9 //判断栈是否为空 10 public synchronized boolean isEmpty(){ 11 return q1.isEmpty()&&q2.isEmpty(); 12 } 13 14 //统计栈中元素个数 15 public synchronized int size(){ 16 return q1.size()+q2.size(); 17 } 18 19 //入栈 20 public synchronized void push(E data){ 21 q1.add(data); 22 } 23 24 //出栈 25 public synchronized E pop(){ 26 E temp = null; 27 //如队列q1只有一个元素,q1直接取队首元素并输出 28 if(q1.size()==1) 29 temp = q1.poll(); 30 31 //如队列q1不止一个元素,q1取队首元素并放入q2中,直到倒数第二个元素,最后一个元素输出, 32 //然后再将q2中元素入队列q1 33 if(q1.size()>1){ 34 for(int i=0;i<q1.size();i++){ 35 q2.add(q1.poll()); 36 } 37 38 temp=q1.poll(); //取队列q1最后一个元素 39 40 while(!q2.isEmpty()){//再将q2中元素入队列q1 41 q1.add(q2.poll()); 42 } 43 } 44 return temp; 45 } 46 47 //取栈顶元素 48 public synchronized E peek(){ 49 E temp = null; 50 //如队列q1只有一个元素,q1直接取队首元素并输出 51 if(q1.size()==1) 52 temp = q1.peek(); 53 54 //如队列q1不止一个元素,q1取队首元素并放入q2中,直到倒数第二个元素,最后一个元素输出, 55 //然后再将q2中元素入队列q1 56 if(q1.size()>1){ 57 for(int i=0;i<q1.size();i++){ 58 q2.add(q1.poll()); 59 } 60 temp=q1.peek(); 61 62 while(!q2.isEmpty()){ 63 q1.add(q2.poll()); 64 } 65 } 66 return temp; 67 } 68 }