首页 > 代码库 > 判断一个序列是否是栈的弹出序列

判断一个序列是否是栈的弹出序列

给定两个序列,判断后一个序列是否是

第一个序列入栈的出栈顺序

学习过在数据结构的人肯定遇到过很多这种题目

    比如给定一个序列  如 1 2 3 4 5的入栈序列
    问 4 5 3 2 1是不是前者的一个出栈序列
  • 思路

首先看 出栈序列 4 5 3 2 1 第一个元素是4 也就是说入栈时 必须要先找到4 然后出栈在继续找 5 ,可以用一个栈来存储当前的入栈元素

比如在 4出栈是 此时 栈中应该有 1 2 3 因为 入栈顺序为 1 2 3 4 123 在4的前面,所以还继续在栈中 下面以一个表格来表示

步骤         

操作                

 栈中元素             

弹出数字  第一个为4,先找到4

1

入栈

 1

 

2

2入栈

 1 2

 

3

3入栈

1 2 3

 

4

4入栈

1 2 3 4

此时栈顶元素等于出栈顺序的第一个,找到了,下一步就是要出栈该元素

5

出栈

1 2 3

出栈顺序往后移动,指向

6

5入栈

1 2 3 5

此时栈顶元素等于出栈顺序的第一个,找到了,下一步就是要出栈该元素

7

5出栈

1 2 3

4 5 出栈往后移动  指向3

8

3出栈

1 2 

4 5 3因为栈顶元素等于 出栈元素

9

2出栈

1

4 5 3 2因为栈顶元素等于 出栈元素

10

1出栈

 

4 5 3 2 1出完了  如果占为空 且出栈序列中没有了其他就表示为true



代码如下所示:

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

bool JudgeStackA_B(int *pushnumber,int *popnumber,int length)
{
        bool result=false;

        if(pushnumber!=NULL&&popnumber!=NULL&&length>0)
        {
            int *p=pushnumber;
            int *q=popnumber;
            stack<int> s;

            while(q-popnumber<length)
            {
                while(s.empty()||*q!=s.top())
                {
                    if(p-pushnumber==length)  // 表示 全 部元素入栈
                        break;
                    s.push(*p);
                    p++;

                }

                if(s.top()!=*q)  // 表示 全 部元素入栈是否找到了相等的出栈元素 没有就结束
                    break;
                s.pop();
                q++;
            }

            if(s.empty()&&q-popnumber==length)   
                result=true;
        }

        return result;


}

void main()
{
    int a[5]={1,2,3,4,5};
    int b[5]={4,5,2,3,1};

    if(JudgeStackA_B(a,b,5))
        printf("Yes\n");
    else
        printf("No\n");
}

判断一个序列是否是栈的弹出序列