22. 棧的壓入、彈出序列(代碼未完成)

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

  思路:先看彈出序列,拿例子說:要先彈出4,因此根據壓棧序列看,1,2,3都已經在棧中,而後4在棧頂,彈出。就是先對比壓入棧的棧頂元素,若是相同則彈出,不一樣則查看是否存在於未壓入的元素中。spa

#include<iostream>
#include<stack>
using namespace std;

bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
{
    bool bPossible = false;

    if (pPush != NULL && pPop != NULL && nLength > 0)
    {
        const int* pNextPush = pPush;
        const int* pNextPop = pPop;

        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)
        {
            bPossible = true;
        }

    }

    return bPossible;
}
相關文章
相關標籤/搜索