思路

贪心+模拟
如果栈顶比后面所有的数字都大,那么一定要弹出去,不然最后结果一定不是最大的(会被比他小的数字压到后面)。
所以我们就不断的去模拟这个操作就好了
首先维护一个后缀最大值数组q[i] 表示原数组[i-n)里最大的数字
然后遍历整个数组,依次入栈
6 7 8 3 7
第一步发现8比后面的数字都大所以弹出
第二步发现7(i==1)也大于等于后面数字最大值 所以弹出
最后依次弹出7 3 6
最后结果8 7 7 3 6


#include<bits/stdc++.h>
using namespace  std;
typedef long long ll;
const ll N = 1000000;
const ll Mod = 1000000009;
int r[N + 5], q[N + 5];
bool cmp(int a, int b)
{
    return a > b;
}
int main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int n;
    bool flag = 1;
    stack<int> s;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> r[i];
    }
    for (int i = n-1; i >= 0; i--)
    {
        q[i] = max(r[i], q[i+1]);
    }
    for (int i = 0; i < n; i++)
    {
        s.push(r[i]);
        while (!s.empty() && s.top()>= q[i + 1])
        {
            if (flag)
            {
                cout << s.top();
                flag = 0;
            }
            else
            cout << " " << s.top();
            s.pop();
        }
    }
}