题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等,例如序列1,2,3,4,5是某栈的压栈序列,序列,4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2不是该压栈序列的弹出序列。


    一样的。我们需要确定这个序列的弹出顺序,我们需要建立一个辅助栈。在栈的压入与弹出中。我们压入以后的数据能够弹出。但是弹出以后被弹出的这个数据不能够在被压回去了。因为对于弹出序列来说。数据具有使用的单一回值性。不允许反复。那就是2个数据了。

    例如1,2,3,4,5,它的4,5,3,2,1,的弹出序列过程是这样的:

    wKiom1bT9JiwMgNqAACQhFElsGk597.png然后对于题中给出的4,3,5,1,2:

wKiom1bT9Wiic8eOAADHh1vDXHs875.png所以根据这样的思路。我们写出代码:

bool IsPopOrder(const int* pPush,const int* pPop,int nLength)
{
    bool bPossible = fales;
    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;
}

OK.