码迷,mamicode.com
首页 > 其他好文 > 详细

栈的弹出、压入序列

时间:2015-06-15 20:31:04      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

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

 

思路:

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

 

代码如下:

#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;
}

技术分享

栈的弹出、压入序列

标签:

原文地址:http://www.cnblogs.com/runninglzw/p/4579018.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!