劍指offer第二版面試題9:用兩個隊列實現棧(JAVA版)

題目:用兩個隊列實現棧。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;
    }
}
相關文章
相關標籤/搜索