劍指offer面試題7相關題目:用兩個隊列實現一個棧
解題思路:根據棧的先入后出和隊列的先入先出的特點
1.在push的時候,把元素向非空的隊列內添加
2.在pop的時候,把不為空的隊列中的size()-1份元素poll出來,添加到另為一個為空的隊列中,再把隊列中最后的元素poll出來
兩個隊列在棧不為空的情況下始終是有一個為空,另一個不為空的。push添加元素到非空的隊列中,pop把非空隊列的元素轉移到另一個空的隊列中,直到剩下最后一個元素,這個元素就是要出棧的元素(最后添加到隊列中的元素)。
1 package Solution; 2 3 import java.util.LinkedList; 4 import java.util.Queue; 5 6 /** 7 * 劍指offer面試題7相關題目:用兩個隊列實現一個棧 8 * 解題思路:根據棧的先入后出和隊列的先入先出的特點 9 * 在push的時候,把元素向非空的隊列內添加 10 * 在pop的時候,把不為空的隊列中的size()-1份元素poll出來,添加到另為一個為空的隊列中,再把隊列中最后的元素poll出來 11 * 兩個隊列在棧不為空的情況下始終是有一個為空,另一個不為空的。push添加元素到非空的隊列中,pop把非空隊列的元素轉移到另一個空的隊列中, 12 * 直到剩下最后一個元素,這個元素就是要出棧的元素(最后添加到隊列中的元素)。 13 * @author GL 14 * 15 */ 16 public class No7StackWithTwoQueues { 17 18 public static void main(String[] args) { 19 push(1); 20 push(2); 21 push(3); 22 pop(); 23 push(4); 24 pop(); 25 pop(); 26 pop(); 27 pop(); 28 29 } 30 31 private static Queue<Object> queue1=new LinkedList<Object>(); 32 private static Queue<Object> queue2=new LinkedList<Object>(); 33 34 /* 35 * 向隊列中執行入棧操作時,把元素添加到非空的隊列中 36 */ 37 public static void push(Object item){ 38 if(!queue1.isEmpty()) 39 queue1.offer(item); 40 else 41 queue2.offer(item); 42 System.out.println("入棧元素為:"+item); 43 } 44 45 public static void pop(){ 46 if(!isEmpty()){ 47 if(queue1.isEmpty()){ 48 while(queue2.size()>1){ 49 queue1.offer(queue2.poll()); 50 } 51 System.out.println("出棧元素為:"+queue2.poll()); 52 }else{ 53 while(queue1.size()>1){ 54 queue2.offer(queue1.poll()); 55 } 56 System.out.println("出棧元素為:"+queue1.poll()); 57 } 58 } 59 else 60 throw new RuntimeException("棧為空,無法執行出棧操作"); 61 } 62 63 /* 64 * 檢查棧是否為空 65 */ 66 private static boolean isEmpty(){ 67 return queue1.isEmpty()&&queue2.isEmpty(); 68 } 69 }