題目:用兩個隊列實現棧。spa
分析:經過一系列的棧的壓入和彈出操做來分析用隊列模擬一個棧的過程,如圖所示,咱們先往棧內壓入一個元素a。因爲兩個隊列如今都是空,咱們能夠選擇把a插入兩個隊列中的任一個。咱們不妨把a插入queue1。接下來繼續往棧內壓入b,c兩個元素。咱們把它們都插入queue1。這個時候 queue1包含3個元素a,b,c其中a位於隊列的頭部,c位於隊列的尾部。code
如今咱們考慮從棧內彈出一個元素。根據棧的後進先出的原則,最後被壓入棧的c應該最早被彈出。因爲c位於queue1的尾部,而咱們每次只能從隊列的頭部刪除元素,所以咱們能夠從queue中依次刪除a/b並插入到queue2中,再從queue1中刪除c。這就至關於從棧中彈出元素c了。咱們能夠用一樣的方法從棧內彈出元素b。blog
接下來咱們考慮從棧內壓入一個元素d.此時queue1已經有了一個元素,咱們就把d插入到queue1的尾部。若是咱們再從棧內彈出一個元素,此時被彈出的應該是最後被壓入的d.因爲d位於queue1的尾部,咱們只能先從頭部刪除 queue1的元素並插入到queue2,直到queue1中遇到d再直接把它刪除。如圖所示:隊列
代碼以下:rem
public class MyStack { private Queue<Integer> queue1; private Queue<Integer> queue2; public MyStack(){ queue1=new LinkedList<>(); queue2=new LinkedList<>(); } //添加,哪一個隊列不是空則添加到那個隊列 public void push(Integer num){ if(queue1.size()==0 && queue2.size()==0){ queue1.add(num); }else if(queue1.size()==0){ queue2.add(num); }else{ queue1.add(num); } } //刪除 public Integer pop(){ if(queue1.size() == 0 && queue2.size() == 0){ return null; } int value=0; if(queue1.size()>0){ while(queue1.size()>0){ queue2.add(queue1.remove()); } value=queue1.remove(); } if(queue2.size()>0){ while(queue2.size()>0){ queue1.add(queue2.remove()); } value=queue2.remove(); } return value; } }