【劍指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();
    }
}


更多題目的完整描述,AC代碼,以及解題思路請參考這里https://github.com/iwiniwin/Algorithm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM