題意:給出入棧序列{A},保證{A}各個元素值各不相等,輸出字典序最大的出棧序列.
如入棧序列{A} = 1, 2, 9, 4, 6, 5
則字典序最大的出棧序列為9, 6, 5, 4, 2 1
/* 棧的性質就是先進後出,所以對於依次入棧的兩個元素a,b,有兩種情況: <1>先壓a進棧,不彈出,再壓b進棧,則最終的出棧序列a一定位於b之後。 <2>要想a位於b之前,則只能在b進棧之前把a彈出。 所以求字典序最大的出棧序列,就可以根據這一性質來搞。。設rmax[i] 為區間[i, n]中最大元素,而max_pos則記錄該元素的位置。 <1>初始l=1 <2>若棧為空白,則直接壓入當前元素 若棧頂元素S.top() 比區間[l, n]的最大元素rmax[l]值小,則應該把當前元素到max_pos[l]的這段全都壓入棧(即區間[i, max_pos[l]]),然後pop出此時的棧頂元素,其實也就是rmax[l]. 接著新的l = max_pos[l] + 1. 若S.top() > rmax[l],則棧頂元素出棧,l不變。 <3>重複<2>*/#include <stdio.h>#include<iostream>#include<stack>using namespace std;const int N = 128;stack<int> stk;int n, a[N], rmax[N], max_pos[N];int main() { scanf("%d", &n); for(int i = 0; i < n; ++i) scanf("%d", a+i); for(int i = n-1; i >= 0; --i) if(rmax[i+1] > a[i]) rmax[i] = rmax[i+1], max_pos[i] = max_pos[i+1]; else rmax[i] = a[i], max_pos[i] = i; for(int j = 0, i = 0; i < n; ++i) { if(stk.empty() || stk.top()<rmax[j]) for(int k = max_pos[j]; j <= k; ++j) stk.push(a[j]); printf("%d%c", stk.top(), i<n-1?' ':'\n'), stk.pop(); } return 0;}