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

題目:用兩個棧實現一個隊列。隊列的聲明以下,請實現它的兩個函數appendTail和deletedHead,分別完成在隊列尾部插入節點和在隊列頭部刪除節點的功能。node

分析:
咱們經過一個具體的例子來分析該隊列插入和刪除元素的過程。首先插入一個元素a,不妨先把它插入到stack1,此時stack1 中的元素有{a},stack2爲空。再壓入兩個元素b和c,仍是插入到stack1中,此時stack1中的元素有{a,b,c},其中c位於棧頂,而stack2仍然爲空。app

這個時候,咱們試着從隊列中刪除一個元素。按照隊列先進先出的規則,因爲a比b、c先插入到隊列中,最早被刪除的元素應該是a。元素a存儲在stack1中,但並不在棧頂上,所以不能直接被刪除。注意到stack2咱們還一直沒有使用過,如今是讓stack2發揮做用的時候了。若是咱們把stack1中的元素逐個彈出並壓入stack2,元素在stack2中的順序正好和原來的stack1中的順序相反。所以通過3次彈出stack1和壓入stack2操做以後,stack1爲空,而stack2中的元素是{c,b,a},這個時候就能夠彈出stack2的棧頂a了。此時的stack1爲空,而stack2的元素爲{c,b},其中在棧頂,如圖所示: 函數

 

代碼以下spa

//2個棧實現隊列
class CQueue<E>{
    private Stack<E> stack1;
    private Stack<E> stack2;
    public CQueue(){
        stack1=new Stack<>();
        stack2=new Stack<>();
    }
    //尾部插入,直接插入stack1
    public void appendTail(E node){
        stack1.push(node);
    }
    //從頭部刪除元素
    public E deleteHead(){
        if(stack2.size()==0){
            if(stack1.size()==0){
                throw new RuntimeException();
            }else{
                while(stack1.size()!=0){
                    stack2.push(stack1.pop());
                }
            }
        }
        return stack2.pop();
    }
}
相關文章
相關標籤/搜索