【刷算法】棧的壓入、彈出序列

問題形貌

輸入兩個整數序列,第一個序列示意棧的壓入遞次,請推斷第二個序列是不是為該棧的彈出遞次。假定壓入棧的一切数字均不相稱。比方序列1,2,3,4,5是某棧的壓入遞次,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不多是該壓棧序列的彈出序列。(注重:這兩個序列的長度是相稱的)

剖析

實在該題就是考核一個進棧序列可否和一個出棧序列對應起來,然則辣手的處所在於:一個進棧序列能夠會有多個出棧的遞次,所以照樣得好好想一想。

能夠從一個簡樸的例子最先:

序列A:1,2,3

序列B:2,3,1

1先進棧,B序列中未出棧的第一個数字是2,申明此時1不能再接着出棧;

2再進棧,B序列中未出棧 的第一個数字是2,申明第一個出棧的数字是2,那末2就此出棧;

此時棧頂元素為1,B序列中未出棧的第一個数字是1,申明1是自2出棧后的再一個出棧元素,那末1就此出棧,此時棧為空;

3繼承進棧,此時B序列的中未出棧的第一個数字是3,申明3是再一個出棧元素,那末3就此出棧,此時棧為空,序列A也全都進棧終了了;

棧空了,序列A也進棧終了了,申明B就是A的彈出序列。

代碼完成

接着這個思緒,能夠試着寫代碼了

function IsPopOrder(pushV, popV)
{
    if(pushV.length === 0 || popV.length === 0 || pushV.length !== popV.length)
        return false;
    // 進棧序列和出棧序列離別有一個指針,從頭最先
    var curPushIndex = 0, curPopIndex = 0;
    var stack = [];
    
    for(;curPushIndex < pushV.length;curPushIndex++) {
        
        stack.push(pushV[curPushIndex]);
        while(curPopIndex < popV.length && stack[stack.length-1] === popV[curPopIndex]){
        // 棧頂元素和當前popIndex指向的数字一樣的話,stack彈出棧頂元素,且當前popIndex指向pop序列的下一個数字
            stack.pop();
            curPopIndex++;
        }
    }
    // 棧中元素沒有悉數彈出,申明兩個序列並不婚配,不然,就是婚配
    return stack.length === 0;
}
    原文作者:亞古
    原文地址: https://segmentfault.com/a/1190000015384853
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞