入栈序列和出栈序列

时间限制(普通/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. windows下VisualSVN Server搭建

    转自:https://www.cnblogs.com/shuilangyizu/p/10365604.html 使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和 ...

  2. win7+64位笔记本 python3.6安装opencv3

    1.直接在cmd窗口下用pip,输入 pip install opencv-python 安装成功是如下界面: 不放心还可以验证下,方法是cmd窗口下输入python,然后输入 import cv2 ...

  3. Android数据适配器Adapter简介

    1.简介 Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到view上,在常见的View(List View,Grid View)等地方都需要用到Adapter! ...

  4. codeforces 1195D2-Submarine in the Rybinsk Sea

    传送门:QAQQAQ 题意:自己看 思路:就是一个类似于数位DP的东西... 统计a[i]数位分解的数在每一位出现的个数,即分两种讨论: 1.位数小于当前j,则j会出现在q+i,而且计算顺序互换会计算 ...

  5. Java学习之二(线程(了解) JVM GC 垃圾回收)

    线程与进程(了解)→JVM→字节码→GC 一.程序 = 算法 + 数据结构(大佬) 二.程序 = 框架 + 业务逻辑(现实) 1.线程与进程.同步与异步 1.1进程是什么? 进程就是操作系统控制的基本 ...

  6. JavaEE三层架构

    三层架构         三层架构是javaee规范中的推荐架构,传统意义上是分为表示层(UI).业务逻辑层(BLL).数据访问层(DAL).在javaee的开发中,三层架构具体分为表示层(web层) ...

  7. 使用async读取异步数据

    使用传统方式读取异步数据 const fs = require('fs') fs.readFile('readme.txt', function (err, data) { console.log(d ...

  8. python学习笔记4_数据清洗与准备

    一.处理缺失值 pandas使用浮点值NaN(Not a Number)来显示缺失值,并将缺失值称为NA(not available(不可用)). NA常用处理方法: dropna:根据每个标签的值是 ...

  9. pycharm使用教程链接+部分练习题01

    pycharm安装: https://www.cnblogs.com/jin-xin/articles/9811379.html pycharm使用教程: https://edu.51cto.com/ ...

  10. c++ 读取8, 10, 16进制数

    c++基础知识都快忘了..记一下 dec-十进制(默认) oct-八进制 hex-十六进制