22. 棧的壓入、彈出序列

題目描述

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。

解析

如果下一個彈出的數字剛好是棧頂數字,那麼直接彈出。如果下一個彈出的數字不在棧頂,需要把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下一個需要彈出的數字壓入棧頂爲止。如果所有數字都壓入棧了,仍然沒有找到下一個彈出的數字,那麼該序列不可能是一個彈出序列。

實現

bool IsPopOrder(const int* pPush, const int* pPop, int nLength){
    bool result = false;
    if (pPush == NULL || pPop == NULL || nLength <= 0)
        return result;
    const int* pNextPop = pPop;
    const int* pNextPush = pPush;
    std::stack<int> stackData;  //輔助棧
    while (pNextPop - pPop != nLength){ //循環終止條件:所有彈出序列的數據都從輔助棧中彈出
        //壓棧序列入棧
        while (stackData.empty() || stackData.top() != *pNextPop){ //輔助棧爲空 或輔助棧頂數據不等於彈出序列要彈出的數據
            if (pNextPush-pPush == nLength)   //壓棧序列的數據都壓入到輔助棧中
                break;
            stackData.push(*pNextPush);
            pNextPush++;
        }

        if (stackData.top() != *pNextPop)  
            break;
        stackData.pop();
        pNextPop++;
    }
    if (stackData.empty() && pNextPop - pPop == nLength)
        result = true;
    return result;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章