准備筆試,在看相關知識,看到這個問題,如何使用兩個隊列模擬一個棧,在參考了相關知識下,實現了代碼如下:
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 }