如圖所示,我們先往棧內壓入一個元素a。由於兩個隊列現在都是空,我們可以選擇把a插入兩個隊列中的任一個。我們不妨把a插入queue1。接下來繼續網棧內壓入b,c兩個元素。我們把它們都插入queue1。這個時候 queue1包含3個元素a,b,c其中a位於隊列的頭部,c位於隊列的尾部。
現在我們考慮從棧內彈出一個元素。根據棧的后入先出的原則,最后被壓入棧的c應該最先被彈出。由於c位於queue1的尾部,而我們每次只能從隊列的頭部刪除元素,因此我們可以從queueu中依次刪除a/b/c並插入到queue2中,再從queue1中刪除c。這就相當於從棧中彈出元素c了。我們可以用同樣的方法從棧內彈出元素b。
接下來我們考慮從棧內壓入一個元素d.此時queue1已經有了一個元素,我們就把d插入到queue1的尾部。如果我們再從棧內彈出一個元素,此時被彈出的應該是最后被壓入的d.由於d位於queue1的尾部,我們只能先從頭部刪除 queue1的元素並插入到queue2,直到queue1中遇到d再直接把它刪除。如果所示:

import java.util.LinkedList; public class StackByTwoQueue { private LinkedList<String> queue1 = new LinkedList<String>(); private LinkedList<String> queue2 = new LinkedList<String>(); /* * 兩個隊列實現一個棧 * pop完成出棧操作,push完成入棧操作 */ public void push(String obj) { if(queue1.isEmpty()){ queue2.add(obj); } if(queue2.isEmpty()){ queue1.add(obj); } } public String pop() { //兩個棧都為空時,沒有元素可以彈出 if (queue1.isEmpty()&&queue2.isEmpty()) { try { throw new Exception("stack is empty"); } catch (Exception e) { } } if(queue1.isEmpty()){ while(queue2.size()>1){ queue1.add(queue2.poll()); } return queue2.poll(); } if(queue2.isEmpty()){ while(queue1.size()>1){ queue2.add(queue1.poll()); } return queue1.poll(); } return null; } public static void main(String[] args) { StackByTwoQueue stack = new StackByTwoQueue(); for(int i=0;i<10;i++){ stack.push(i+""); } for(int i=0;i<20;i++){ System.out.println(stack.pop()); } } }
