#include<iostream>
#include<stack>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
stack<int>sk;
int n, a[1000000];
int pos[1000000] = { 0 };
cin >> n;
for (int i = 0; i < n; i++)cin >> a[i];
for (int i = n - 1; i >= 0; i--)pos[i] = max(pos[i + 1], a[i]);
for (int i = 0; i < n; i++)
{
sk.push(a[i]);
if (sk.top() == pos[i])
{
cout << sk.top() << ' ';
sk.pop();
while (!sk.empty() && sk.top() > pos[i + 1])
{
cout << sk.top() << ' ';
sk.pop();
}
}
}
while (!sk.empty())
{
cout << sk.top() << ' ';
sk.pop();
}
return 0;
}
-
输入处理:首先,代码从标准输入读取一个整数
n
,表示接下来要读取的数组a
的长度。然后,它读取n
个整数填充到数组a
中。 -
计算每个位置的最大值:通过一个从后往前的循环,代码计算了数组
a
中每个位置i
(从n-1
到0
)向后看的最大值,并将这些值存储在数组pos
中。这样,pos[i]
就表示从位置i
到数组末尾的最大值。 -
使用栈处理数组元素:接下来,代码遍历数组
a
的每个元素,并使用一个栈sk
来存储遍历过程中遇到的元素。对于每个元素a[i]
,它首先将其推入栈中。然后,它检查栈顶元素(即最近推入的元素)是否等于当前位置的最大值pos[i]
。-
如果栈顶元素等于
pos[i]
,这意味着当前元素是一个局部最大值(至少从当前位置到末尾的最大值)。此时,代码会打印出这个最大值,并从栈中弹出它。然后,它继续检查栈中的元素,如果它们大于pos[i+1]
(即下一个位置的最大值),也会被打印并弹出。这一步是为了处理可能存在的、在当前最大值之后但在下一个最大值之前的较大值,但它们在全局上不是最大的。 -
如果栈顶元素不等于
pos[i]
,则继续遍历数组。
-
-
打印剩余栈中的元素:遍历完数组
a
后,栈中可能还剩下一些元素,这些元素都是小于它们各自位置之后最大值的元素。因此,代码最后会打印出栈中剩余的所有元素。