栈的压入,弹出序列

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


bool IsPopOrder(int *pPush, int *pPop, int length)
{
    if(NULL == pPush || NULL == pPop || 0 >= length) return false;

    bool isPossible = false;
    const int *pNextPush = pPush;
    const int *pNextPop = pPop;

    stack<int> stackData;

    while(pNextPop - pPop < length) // 对出栈序列进行测试
    {
        /**
         * 若出栈序列中有i,则在进栈队列中i之前的元素必然要进栈
         */
        while(stackData.empty() || stackData.top() != *pNextPop)
        {
            if(pNextPush - pPush == length) break; // 进栈队列为空

            stackData.push(*pNextPush);
            ++pNextPush;
        }

        if(stackData.top() != *pNextPop) break; // 栈顶元素必然是要出栈元素

        stackData.pop();
        ++pNextPop;
    }

    if(stackData.empty() && pNextPop - pPop == length)
    {
        isPossible = true;
    }

    return isPossible;
}

 

问题

判断一数字序列是否为这些数字入栈的一种出栈方式(前提:栈中的数字不重复)

例如

假设入栈的序列为:1 2 3 4 5

那么4 5 3 2 1为一种弹出序列, 4 3 5 1 2不是

 

posted @ 2015-08-10 19:14  指上弹兵赵小括  阅读(173)  评论(0编辑  收藏  举报