栈的弹出、压入序列

题目:判断一数字序列是否为这些数字入栈的一种出栈方式

 

思路:

首先申请一个辅助栈来模拟进栈出栈,然后判断栈顶元素和出栈数字是否一致,不一致则入栈序列依次进栈,直到栈顶元素和出栈数字一致时:弹出栈顶元素,出栈序列的指针后移,当进栈序列最后一位数字进栈并且它和出栈数字不相符的话,证明弹出序列不正确。

 

代码如下:

#include<iostream>
#include<stack>
using namespace std;
bool isorder(const int *push,const int * pop,int length)
{
    if(push!=NULL && pop!=NULL && length>0)
    {
        bool result=false;
        const int *newpush=push;
        const int *newpop=pop;
        stack<int> data;
        while(newpop-pop<length)
        {
            //如果栈为空或者栈的最上面不等于要弹出的数,则入栈
            if(data.size()==0||*newpop!=data.top())
            {
                data.push(*newpush);
                newpush++;
                //最后一个数已经进栈
                if(newpush-push>=length)
                {
                    //如果栈的最上面不等于要弹出的数,而此时最后一个数已经进栈,证明不是出栈序列
                    if(*newpop!=data.top())
                        break;
                }
            }
            else{
                //如果要弹出的数字和栈顶元素一致,则栈弹出
                data.pop();
                newpop++;
            }
        }
        //如果栈为空并且弹出序列到达末尾,则证明是出栈序列
        if(newpop-pop==length && data.size()==0)
            result=true;
        return result;
    }
}

测试代码及运行结果:

int main()
{
int a[5]={1,2,3,4,5};
int b[5]={4,5,3,2,1};
int c[5]={4,3,5,1,2};
cout<<isorder(a,b,5)<<endl;
cout<<isorder(a,c,5)<<endl;
return 0;
}

posted @ 2015-06-15 19:36  runninglzw  阅读(202)  评论(0编辑  收藏  举报