入栈序列和出栈序列

时间限制(普通/Java):1000MS/3000MS         运行内存限制:65536KByte

总提交:293          测试通过:68

比赛描述

给出入栈序列{A},保证{A}各个元素值各不相等,输出字典序最大的出栈序列.

如入栈序列{A} = 1, 2, 9, 4, 6, 5

则字典序最大的出栈序列为9, 6, 5, 4, 2, 1

输入

第一行一个整数n (1 <= n <= 100).

接下来是入栈序列{A}, n个正整数ai(0 < ai < 1000),且i != j则ai != aj.

输出

一行,字典序最大的出栈序列.   每个数字以空格分开。

样例输入



2 1 9 4 6 5

样例输出

9 6 5 4 1 2

提示

null

题目来源

NUPT

题目思路:

此题可转化为:使用一个队列(或栈,为了便于区分该数字序列与空栈,我们采用队列的叙述方式进行叙述)来表示初始数字序列,通过一个空栈辅助,输出最大字典序。

保证字典序最大,必须保证第一个数字为整个数列中最大的数字。

从该数字分开,前一段入栈,后一段留在数字序列中。

用栈顶元素 与  数字序列中数字最大值比较,若数字序列中值大,则不断从序列中出队数字压入栈中,后将该最大值输出;反之,则弹出栈顶元素。

如果采用扫描的方法找数字序列中的最大值,复杂度将为O(n^2)。

我们可以采用以下方法进行处理(最终算法):

1、初始化:

f[i]表示数字序列中第i个数往后所有数中最大的数。将数字序从后往前遍历,初始化f[i],f[1]即为最大值。

从该最大值分开,前一段入栈,后一段保留在数字序列中。

2、循环处理,直至全部输出:

1、边界:若栈空,则从数字序列中出队元素压入栈

2、边界:若数字序列空,弹出栈中所有元素

3、若栈顶元素大于等于f[head]:弹出栈顶

若栈顶元素小于f[head]:出队数字序列中的一个元素压入栈。

注意:NOJ不过滤多余的空格和换行符

代码如下:(代码凌乱,仅供参考)

#include<iostream>
#include<cstdio> int f[200];
int n; int num[200];
int head; int stack[200];
int top;
int size; int k,cnt; int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
} f[n]=num[n];
num[0]=-9999999;
for(int i=n-1;i>=0;i--)
{
if(f[i+1]<num[i])
{
f[i]=num[i];
k=i;
}
else
{
f[i]=f[i+1];
}
} for(int i=1;i<=k-1;i++)
{
stack[++top]=num[i];
size++;
}
printf("%d ",num[k]);
cnt++;
head=k+1;
while(cnt!=n)
{
if(size==0)
{
size++;
stack[++top]=num[head++];
}
else if(head==n+1)
{
while(size!=0)
{
if(cnt==n-1)printf("%d",stack[top]);
else printf("%d ",stack[top]);
top--;
size--;
cnt++;
}
}
else
{
if(stack[top]>=f[head])
{
if(cnt==n-1)printf("%d",stack[top]);
else printf("%d ",stack[top]);
top--;
size--;
cnt++;
}
else
{
stack[++top]=num[head++];
size++;
}
}
}
return 0;
}

【NOJ2024】入栈序列和出栈序列的更多相关文章

  1. 写一个栈,实现出栈、入栈、求最小值,时间复杂度为O(1)

    #-*-coding:utf-8-*- ''' 需求:写一个栈,实现出栈.入栈.求最小值,时间复杂度为O(1) 思路:通过两个栈实现,一个栈stack,一个辅助栈min_stack,记录stack中的 ...

  2. 剑指 Offer 31. 栈的压入、弹出序列 + 入栈顺序和出栈顺序的匹配问题

    剑指 Offer 31. 栈的压入.弹出序列 Offer_31 题目详情: 解析: 这里需要使用一个栈来模仿入栈操作. package com.walegarrett.offer; /** * @Au ...

  3. Python 根据入栈顺利判定出栈顺序

    1.读取入栈,出栈数据: 2.把数据分别转化成整数列表: 3.新建栈列表,用入栈数据进行压栈:如果栈列表不为空,并且栈顶层数据为出栈的元素:删除栈列表的顶层数据: 4.如果栈列表不为空,说明栈列表里面 ...

  4. 一个栈的入栈序列为ABCDEF,则不可能的出栈序列是

    技术之瞳 阿里巴巴技术笔试心得习题2.65:  一个栈的入栈序列为ABCDEF,则不可能的出栈序列是(D)  A.DEFCBA B.DCEFBA C.FEDCBA  D.FECDBA E.ABCDEF ...

  5. 牛客网剑指offer第21题——判断出栈序列是否是入栈序列

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  6. SDUT-3334_数据结构实验之栈与队列七:出栈序列判定

    数据结构实验之栈与队列七:出栈序列判定 Time Limit: 30 ms Memory Limit: 1000 KiB Problem Description 给一个初始的入栈序列,其次序即为元素的 ...

  7. 基于visual Studio2013解决面试题之0409判断一个栈是否另外一个栈的弹出序列

     题目

  8. C++中栈的出栈,入栈规则:A,B,C,D,E

    考题: 栈底至栈顶一次存放元素 ABCD 在第五个元素E入栈之前  栈中元素可以出栈,则出栈序列可能是_____a d___________. a.  ABCED b.  DBCEA   c.  CD ...

  9. n个元素的入栈顺序有多少种出栈顺序?

    问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的 ...

随机推荐

  1. angularjs中使用swiper时不起作用,最后出现空白位

    controller.js中定义swipers指令: var moduleCtrl = angular.module('newscontroller',['infinite-scroll','ngTo ...

  2. poi 3669 meteor shower (bfs)

    题目链接:http://poj.org/problem?id=3669 很基础的一道bfs的题,然而,我却mle了好多次,并且第二天才发现错在了哪里_(:з)∠)_ 写bfs或者dfs一定要记得对走过 ...

  3. 《DSP using MATLAB》Problem 8.17

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  4. sqlmap:wins系统+python3上安装

    python2和python3互不兼容,SqlMap是基于python2的,所以SqlMap不支持python3,这里使用virtualenvwrapper切换python版本: 一.sqlmap的安 ...

  5. java连接neo4j

    呼.博客要落灰了 记录一下Java连接neo4j的问题. 首先是neo4j的下载和配置,基本参考https://blog.csdn.net/appleyk/article/details/790918 ...

  6. 使用Colaboratory的免费GPU训练神经网络

    1 Colaboratory 介绍 Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并 ...

  7. 2、设备树的规范(dts和dtb格式)

    第01节_DTS格式(1) 语法:Devicetree node格式:[label:] node-name[@unit-address] { [properties definitions]      ...

  8. Django项目:CMDB(服务器硬件资产自动采集系统)--10--06CMDB测试Linux系统采集硬件数据的命令05

    cd /py/AutoClient/bin python3 auto-client.py /usr/local/python3/bin/pip install requests python3 aut ...

  9. java的堆栈通俗理解

    java内存模型有堆内存和栈内存, 初学者可能看官方解释很模糊 堆:new 出来的对象或者数组都存放在堆中: List <String> list =new ArrayList<St ...

  10. Python学习之高阶函数--嵌套函数、函数装饰器、含参函数装饰器

    玩了一晚上王者,突然觉得该学习,然后大晚上的搞出来这道练习题,凌晨一点写博客(之所以这么晚就赶忙写是因为怕第二天看自己程序都忘了咋写的了),我太难了o(╥﹏╥)o 言归正传,练习题要求:构造类似京东的 ...