棧的壓入、彈出序列(是否合法)

元素出棧、入棧順序的合法性。如:入棧的序列(1,2,3,4,5),出棧序列爲(4,5,3,2,1),則合法。入棧的序列(1,2,3,4,5),出棧序列爲(4,5,2,3,1),則不合法。

bool IsPopOrder(const int* pPush, const int* pPop, int nLength) //三個參數:壓入序列,彈出序列,序列長度
{
    bool bProssible = false;
    if (pPush != NULL && pPop!= NULL && nLength > 0)
    {
        const int* pNextPush = pPush;           //讀取壓入序列
        const int* pNextPop = pPop;             //讀取彈出序列

        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)  //數據棧爲空並且已經全部壓入,說明彈出序列匹配
            bProssible = true;
    }
    return bProssible;
}
發佈了40 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章