• 栈(出栈序列)


    已知自然数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
    ");
            else
                printf("No
    ");
        }
        return 0;
    }

     第二种方法

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <stack>
    using namespace std;
    int main()
    {
        int N;
        while(scanf("%d",&N)!=EOF&&N)
        {
            stack <int> s1,s3;
            int s2[15000];
            int d=2,i,flag=0;
            for(i=1;i<=N;i++)
                scanf("%d",&s2[i]);
            for(i=N;i>=1;i--)
                s1.push(s2[i]);
            s3.push(1);
            while(1)
            {
                if(s3.top()==s1.top())
                {
                    s1.pop();
                    s3.pop();
                }
                if(s1.empty()&&s3.empty())
                {
                    flag=1;
                    break;
                }
    
                if(s3.empty())
                    s3.push(d++);
                else if(s3.top()!=s1.top())
                    s3.push(d++);
                if(d==N+2)
                        break;
            }
            if(flag)
                printf("Yes
    ");
            else
                printf("No
    ");
        }
    }
  • 相关阅读:
    【POJ 1655】Balancing Act
    【POJ 2631】 Roads in the North
    【洛谷 1002】 过河卒
    【洛谷 3178】树上操作
    【洛谷 1060】开心的金明
    【洛谷 2709】小B的询问
    【洛谷 1972】HH的项链
    JavaSpark-sparkSQL
    java8下spark-streaming结合kafka编程(spark 2.3 kafka 0.10)
    Kafka 使用Java实现数据的生产和消费demo
  • 原文地址:https://www.cnblogs.com/ljhacm/p/6722456.html
Copyright © 2020-2023  润新知