栈和排序(栈的应用)

原题链接
https://ac.nowcoder.com/acm/problem/blogs/14893

思路
处理一下每一个数字后面的最大数,然后根据顺序入栈,判断当前这个位置后面最大的元素和当前的栈顶元素,只要当前栈顶元素大于这个最大数就弹出,直到栈顶元素小于当前的m[i + 1];

代码

#include <iostream>
#include <stack>
#include <algorithm>

using namespace std;

const int N = 1000010;

stack<int> stk;

int a[N];
int m[N];

int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++ ) cin >> a[i];
    for (int i = n; i >= 1; i -- ) m[i] = max(a[i], m[i + 1]);  // 处理i之后最大的数(包括自己)
    
    for (int i = 1; i <= n; i ++ )
    {
        stk.push(a[i]);  // 先入栈
        while (stk.size() && stk.top() > m[i + 1])  // 如果后面没有比栈顶大的就要输出
        {
            int t = stk.top();
            cout << t << ' ';
            stk.pop();
        }
    }
    
    return 0;
}
posted on 2021-04-25 20:02  Laurance  阅读(111)  评论(0)    收藏  举报