栈和排序(栈的应用)
原题链接
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;
}
浙公网安备 33010602011771号