#include <iostream> #include <climits> using namespace std; const int N = 1e6 + 10; int main() { int n = 0; int top = 0; int a[N]; int maxe[N]; int s[N]; cin >> n; getchar(); for (int i = 0; i < n; i++) { cin >> a[i]; } getchar(); //maxe在i = n-1 时会访问maxe[n],产生越界问题,故初始化maxe[n] = -INF 或 INT_MIN maxe[n] = INT_MIN; for(int i = n - 1; i >= 0; i--) { maxe[i] = max(maxe[i + 1], a[i]);//后缀最大值 } /* maxe[4] = max(maxe[5], a[4]) = max(INT_MIN, 4) = 4 maxe[3] = max(maxe[4], a[3]) = max(4,3) = 4 maxe[2] = max(maxe[3], a[2]) = max(4,5) = 5 maxe[1] = max(maxe[2], a[1]) = max(5,1) = 5 maxe[0] = max(maxe[1], a[0]) = max(5,2) = 5 maxe = {5,5,5,4,4} */ for(int i = 0; i < n; i++) { s[top] = a[i];//将当前元素压入栈 top++;//并将top指向下一个 while(top && s[top - 1] > maxe[i + 1]) { cout << s[--top] << " ";//弹出并输出栈顶元素 } } /* a[i] 存放在 s[top -1],a[i+1]到a[n-1]最大的元素值存放在maxe[i+1], 如果a[i] > maxe[i+1],说明a[i] 比后面元素都大,则弹出栈并输出 i = 0; a[i] = a[0] = 2; s = {2}; maxe[i+1] = maxe[1] = 5; 3>5?否,不弹出 - i = 1; a[i] = a[1] = 1; s = {2,1}; maxe[i+1] = maxe[2] = 5; 2>5?否,不弹出 - i = 2; a[i] = a[2] = 5; s = {2,1,5}; maxe[i+1] = maxe[3] = 4; 5>4?是,弹出 5 i = 3; a[i] = a[3] = 3; s = {2,1,3}; maxe[i+1] = maxe[4] = 4; 3>4?否,不弹出 - i = 4; a[i] = a[4] = 4; s = {2,1,3,4}; maxe[i+1] = maxe[5] = INT_MIN; 4>INT_MIN?是,弹出 4 s = {2,1,3}; maxe[i+1] = INT_MIN; 3>INT_MIN?是,弹出 3 s = {2,1}; maxe[i+1] = INT_MIN; 1>INT_MIN?是,弹出 1 s = {2}; maxe[i+1] = INT_MIN; 2>INT_MIN?是,弹出 2 */ //弹出剩余元素(如果栈未空) while(top) { cout << s[--top] << " "; } return 0; } // 64 位输出请用 printf("%lld")