zoukankan      html  css  js  c++  java
  • haha

     

    【问题描述】

      栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序。例如,借助一个栈,依次将数组1,3,2按顺序入栈或出栈,可对其从大到小排序:1入栈;3入栈;3出栈;2入栈;2出;1出栈。在上面这个例子中,出栈序列是3,2,1,因此实现了对数组的排序。遗憾的是,有些时候,仅仅借助一个栈,不能实现对数组的完全排序。例如给定数组2,1,3,借助一个栈,能获得的字典序最大的出栈序列是3,1,2:2入栈;1入栈;3入栈;3出栈;1出栈;2出栈。

      请你借助一个栈,对一个给定的数组按照出栈顺序进行从大到小排序。当无法完全排序时,请输出字典序最大的出栈序列。

    【输入格式】

      输入共2行。

      第一行包含一个整数n,表示入栈序列长度。

      第二行包含n个整数,表示入栈序列。输入数据保证给定的序列是1到n的全排列,即不会出现重复数字。

    【输出格式】

      仅一行,共n个整数,表示你计算出的出栈序列。

    【样例输入】

      3

      2 1 3

    【样例输出】

      3 1 2

    【样例解释】

      这回山里有座塔。

    【数据规模与约定】

      对于30%的数据,1<=N<=10^3。

      对于60%的数据,1<=N<=10^5。

      对于100%的数据,1<=N<=10^6。

    【题目分析】

      f数组处理出到目前可以输出的最大值,要倒叙处理

      

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define ge getchar()
    using namespace std;
    int a[1000001],f[1000001],s[1000001];
    int n,k=1;
    int read()
    {
        int x=0;char ch=ge;
        while(ch<'0'||ch>'9') ch=ge;
        while(ch>='0'&&ch<='9')
        {
            x=x*10+ch-'0';ch=ge;
        }
        return x;
    }
    int main()
    {
        freopen("haha.in","r",stdin);
        freopen("haha.out","w",stdout);
        n=read();
        for(int i=0;i<n;i++)
            a[i]=read();
        for(int i=n-1;i>=0;i--)
            f[i]=max(a[i],f[i+1]);
        s[0]=-1;
        for(int i=0;i<n;i++)
        {
            s[k++]=a[i];
            while(k!=0&&s[k-1]>f[i+1])
                printf("%d ",s[--k]);
        }
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
  • 相关阅读:
    CentOS 6.5 伪分布式 安装 hadoop 2.6.0
    单例模式的思想简介
    最有二叉树 哈夫曼树
    二叉树2
    二叉树1
    栈与队列
    线性表
    字符串模式匹配KMP算法
    数据结构(四) 查找 排序
    数据结构(三) 图
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/6034108.html
Copyright © 2011-2022 走看看