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

栈(出栈序列)

时间:2017-04-17 14:21:28      阅读:326      评论:0      收藏:0      [点我收藏+]

标签:++   play   break   lock   while   span   style   lag   int   

已知自然数1,2,...,N(1≤N≤10000)依次入栈(即a<b当且仅当a先于b入栈),问:序列C1,C2,...,CN是否为可能的出栈序列。
  例如:N=5时,3,4,2,1,5是一个可能的出栈序列,因为其可以按如下操作获得:push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop

Input

 输入数据包含若干组测试样例。
  每组测试样例的第一行为整数N(1≤N≤10000);
  第二行为N个正整数,以空格隔开,为出栈序列;
  输入数据的末尾以一个0表示输入的结束。

Output

对于每组测试样例,输出结果为一行字符串。
  如给出的序列是可能的出栈序列,则输出"Yes",否则输出"No"。
  注意:区分大小写,引号本身不输出。

Sample Input

5
3 4 2 1 5
5
3 5 1 4 2
0

Sample Output

Yes
No
#include<iostream>
#include<cstdio>
#include<stack>
#include<stdio.h>
using namespace std;
int main()
{
    stack<int> s;
    int a[10000]={0};
    int n,flag,i,j,top;
    while(1)
    {
        scanf("%d",&n);
        for(i=0;i<=n-1;++i)
            scanf("%d",&a[i]);
        if(n==0)
            return 0;
        flag=1;
        for(i=1;i<=a[0];++i)
            s.push(i);
        s.pop();
        for(j=1;j<=n-1;++j)
        {
            if(a[j]>a[j-1])
                for(i=a[j-1]+1;i<=a[j];++i)
                {
                    s.push(i);
                    s.pop();
                }
            else
            {
                top=s.top();
                if(top==a[j])
                    s.pop();
                else
                {
                    flag=0;
                    break;
                }
            }
        }
        if(flag==1)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

 

栈(出栈序列)

标签:++   play   break   lock   while   span   style   lag   int   

原文地址:http://www.cnblogs.com/ljhacm/p/6722456.html

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