用兩個棧實現一個隊列,完成隊列的push和pop操作

問題:用兩個棧實現一個隊列,完成隊列的push和pop操作。隊列中的元素均爲int型。

分析:首先相信大家都清楚隊列和棧的特性,棧是先進後出,隊列是先進先出。那麼知道這個特性後就好辦了。

stack1來做進隊列操作。

stack2做出隊列操作:首先判斷stack2中有無元素,若有元素,直接彈出棧頂元素。若無元素,則從stack1中循環取出所有元素放進stack2,然後取出棧頂的元素。

相當於stack1中的元素是正序進入,進入stack2中變成了倒序了。這樣在stack2中取出的棧頂元素實技就是stack1中的棧底元素,這就實現了元素的先進先出。

舉例:元素(1,2,3)進入stack1,這時stack1的分佈爲(1,2,3) (從棧底到棧頂順序),此時stack2爲空,則將stack1中的元素全部放到stack2,由於先進後出,stack1出棧序列爲(3,2,1),因此進入stack2之後的序列爲(3,2,1)(從棧底到棧頂順序)。這時stack2再彈出元素的順序就是(1,2,3),這樣一看,不就是(1,2,3)進隊,(1,2,3)出隊嗎?這樣就利用兩個棧完成了隊列的功能。

現在接着看,假設(1,2,3)進入stack1,然後現在要彈出隊列的隊頂元素。還是和上面分析的一樣,進入stack2之後的順序是(3,2,1),彈出1,此時stack2中還有(1,2)。這時又來了一個元素4,4進入stack1,此時要彈出隊頂元素,即stack2的棧頂元素。由於stack2中有元素(1,2),因此由上述分析,直接彈出2,此時stack2中還有(1),假設再彈出1,然後再彈出一個元素。由於此時stack2中沒有元素了,又從stack1中取出所有元素,此時stack1中只有4,因此4出棧進入stack2,stack2中現在的元素是(1),1出棧。最終我們發現還是符合隊列的特性。

代碼如下: 實測劍指offer可以通過。

import java.util.Stack;

/**
 * 用兩個棧來實現一個隊列,完成隊列的push和pop操作。隊列中的元素爲int型
 * 分析:stack1:用來進隊列。
 *      stack2:用來出隊。先判斷stack2中有無元素,若有元素,直接彈出棧頂元素。
 *              若無元素,則從stack1中循環取元素。取完之後,再彈出棧頂的元素。
 * 相當於stack1中的元素是正序進入,進入stack2中變成倒序了,這時就實現了隊列先進先出的特性。
 *
 * **/
public class stack_queue {

    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public void push(int node){
        stack1.push(node);
    }

    public int pop(){
        if(stack2.empty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }

        return stack2.pop();
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章