栈和排序_via牛客网
题目
链接:https://ac.nowcoder.com/acm/contest/26886/A
来源:牛客网时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld题目描述
给你一个1->n的排列和一个栈,入栈顺序给定
你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列
输入描述:
第一行一个数n 第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格 输出描述:
输出一行n个数表示答案,用空格隔开,结尾无空格 示例1
输入
5 2 1 5 3 4 输出
5 4 3 1 2 说明
2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈
题解
思路:一步一步压栈, 压栈在之后进行while(条件)判断[tips:因为可能top出栈后,新的还是比后面的大],top是不是比后面所有没有入栈的大,如果大,则出栈,否则继续压栈.
注意事项:在使用栈的时候一定要先进行empty判断然后再使用top进行访问,否则会造成越界访问.
后面的最大值可以使用另一个数组进行维护
由于在本题目中都是正整数,所以0可以是求最大值的初始条件.
当压完最后一个的时候,最大值可以视为零,则在while中会依次进行出栈.
代码
#include <iostream> #include <cstdio> #include <stack> #define N 6000000 using namespace std; int s[N]; int smax[N]; stack<int>a; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> s[i]; } for (int i = n - 1; i >= 0; i--) { smax[i] = max(s[i], smax[i + 1]); } for (int i = 0; i < n; i++) { a.push(s[i]); while (!a.empty() && a.top() > smax[i + 1]) { cout << a.top() << ' '; a.pop(); } } /* while (!a.empty() ) { cout << a.top() << ' '; a.pop(); } */ return 0; }
本文来自博客园,作者:心坚石穿,转载请注明原文链接:https://www.cnblogs.com/xjsc01/p/16438272.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律