劍指Offer的學習筆記(C#篇)-- 棧的壓入、彈出序列

題目描述

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能爲該棧的彈出順序。假設壓入棧的全部數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不多是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

一 . 理解題意

        作好此題的關鍵在於讀懂題目的意思,作了部分題目後發現,該題屬於一個不易理解的題目,如今用俗話來解釋一下。兩個內容是同樣,但順序不一樣的序列,其中一個是入棧,一個是出棧,(能夠邊入邊出),讓你判斷一下,出棧的那個對應的究竟是不是入棧的那個。看下圖,實例化解釋一下。spa

        假設,我入棧的序列是1,2,3,4,5,我能夠經過以上的步驟彈出4,5,3,2,1。這就說明4,5,3,2,1是剛纔那個棧的彈出序列。那咱們在舉個反例!看下圖。code

        假設,你壓入的是1,2,3,4,5,這時候你想彈出4,3,5,1,2,這個時候呢,你操做一下,是絕對沒法輸出4,3,5,1,2,極限也就輸出個4,3,5,21,(這是和棧的特性掛鉤的)。blog

        所以,談論一下具體的操做步驟,首先兩個序列是給定的(假設一個叫彈入序列,一個叫彈出序列),先看看彈出序列的第一個數是什麼,由於棧的特性是先進後出,這個時候呢,就須要你把彈出序列的第一個數從彈入序列的開頭進行比對,若是恰好相等,你就把他彈進去,再彈出來;若是不相等,依舊彈進去,而後再和下一個對比,進行循環。就像上面表格裏的同樣,若是你最後彈出的序列和理想的彈出序列一致,證實他是對應的彈出序列,不然就不是咯。it

二 . 代碼實現

using System.Collections.Generic;
class Solution
{
    public bool IsPopOrder(int[] pushV, int[] popV)
    {
        // write code here
        //定義一個棧a,定義一個常數i=0
        Stack<int> a = new Stack<int>();
        int i =0;
        //循環體操做進棧
        for (int j = 0;j<pushV.Length;j++)
        {
            a.Push(pushV[j]);
            //知足i<popV的長度以及第i個出棧數等於頂棧的數執行出棧
            while(i<popV.Length && popV[i]==a.Peek())
            {
                a.Pop();
                i++;
            }
        }
        //輸出
        if(a.Count == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

        哇,說實在的,我好討厭這個題目,我感受我思路是對的,用了兩個for循環,可是提示不是全部代碼都會返回value值,哇,搞得我一頭霧水,不過上面的代碼的確蠻容易懂的,邏輯能力仍是次啊!!!!io

相關文章
相關標籤/搜索