【劍指Offer】用兩個棧實現隊列

題目描述

用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素爲int類型。

棧和隊列

解題前我們先來了解下什麼是棧和隊列
棧是限制插入和刪除只能在一個位置上進行的表,是後進先出表,比如,在棧中依次插入1,2,3,4(由棧頂插入),如下圖所示。由於棧是限制只能在一個位置上進行操作,所以刪除(彈出)也只能在棧頂進行,即彈出順序爲4,3,2,1。正好是最後插入4的最先彈出,最先插入的1最後彈出。
棧

隊列是插入在一端進行而刪除在另一端進行的表,是先進先出表,比如依次在隊列中插入1,2,3,4(這裏是從隊尾插入)。如下圖所示。由於刪除只能在另一端即隊頭(隊首)進行,所以出隊順序爲1,2,3,4。可以看到最先入隊的1是最先出隊,最後入隊的4也是最後出隊。
隊列

解法

題目要求是用兩個棧來模擬一個隊列。棧的特性是後進先出,隊列的特性是先進先出,可以發現他們的順序剛好是相反的。那麼自然就想到相反的相反的就是對的順序了。舉個例子,仍然是往棧A中依次插入1,2,3,4,此時它的彈出順序是4,3,2,1。若再將這個彈出順序4,3,2,1,依次插入到棧B中,此時棧B的彈出順序就是1,2,3,4,對於最開始插入的1,2,3,4序列剛好滿足了先進先出的特性。

實現代碼

using System.Collections.Generic;
class Solution
{
    Stack<int> pushStack = new Stack<int>();
    Stack<int> popStack = new Stack<int>();
    // 入隊
    public void push(int node) 
    {
        pushStack.Push(node);
    }
    // 出隊
    public int pop() 
    {
        if (popStack.Count <= 0)
        {
            while(pushStack.Count > 0)
            {
            	// 在出隊時,先將pushStack中元素依次彈出並插入到popStack中
                popStack.Push(pushStack.Pop());
            }
        }
        // 再通過popStack彈出
        return popStack.Pop();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章