zoukankan      html  css  js  c++  java
  • 栈(出栈序列)

    已知自然数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
    ");
        }
    }
  • 相关阅读:
    gluoncv faster_rcnn 参数修改
    gluoncv 训练自己的数据集,进行目标检测
    Java面试题及答案2020最新版!
    阿里巴巴Java开发手册泰山版下载
    Java基础之如何取舍Joda与 Java8 日期库
    深入理解Java虚拟机3——垃圾回收
    剖析Java OutOfMemoryError异常
    教你如何理解JAVA的I/O类库
    Java源码解读系列(一):ArrayList
    Java 并发之 Executor 框架
  • 原文地址:https://www.cnblogs.com/ljhacm/p/6722456.html
Copyright © 2011-2022 走看看