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

題目描述

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

棧和隊列

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

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

解法

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

實現代碼

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();
    }
}
相關文章
相關標籤/搜索