棧排序


【問題描述】
棧是一種強大的數據結構,它的一種特殊功能是對數組進行排序。例如,借
助一個棧,依次將數組 1,3,2 按順序入棧或出棧,可對其從大到小排序:
1 入棧;3 入棧;3 出棧;2 入棧;2 出棧;1 出棧。


在上面這個例子中,出棧序列是 3,2,1,因此實現了對數組的排序。
遺憾的是,有些時候,僅僅借助一個棧,不能實現對數組的完全排序。例如
給定數組 2,1,3,借助一個棧,能獲得的字典序最大的出棧序列是 3,1,2:
2 入棧;1 入棧;3 入棧;3 出棧;1 出棧;2 出棧。


請你借助一個棧,對一個給定的數組按照出棧順序進行從大到小排序。當無
法完全排序時,請輸出字典序最大的出棧序列。


【輸入格式】


輸入共2行。

第一一個整數?,表示入棧序列長度。
第二行包含?個整數, 表示入棧序列。 輸入數據保證給定的序列是1到 n 的全
排列,即不會出現重復數字。
【輸出格式】


僅一行,共?個整數,表示你計算出的出棧序列。


【樣例輸入】


3
2 1 3


【樣例輸出】


3 1 2


【樣例解釋】


這回山里有座塔,鍾神的塔;


【數據規模與約定】


3 3 。

60%的數據,1 ≤ ? ≤ 10 5 。
對於100%的數據,1 ≤ ? ≤ 10 6

 

思路:

  棧排序,不一定像sort一樣完全有序,只能盡量輸出最大

  所以,我們用貪心策略;

  維護一個后綴最大值,然后每入棧到最大后綴的元素

  如果后綴值小於棧頂元素,則出棧(輸出);

 上代碼:

#include<cstdio>
#include<algorithm>

using namespace std;

int n,a[1000001],zhan[1000005];
int sum[1000001],jkl,head=0,tail=0;

char ch;

void qread(int &x)
{
    x=0,jkl=1;ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')jkl=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+(int)(ch-'0');ch=getchar();}
    x*=jkl;
}

int main()
{
    qread(n);
    for(int i=1;i<=n;i++) qread(a[i]);
    sum[n]=a[n];
    for(int i=n-1;i>=1;i--) sum[i]=max(sum[i+1],a[i]);
    zhan[++head]=a[++tail];
    tail++;
    while(1)
    {
        if(sum[tail]>zhan[head]||!head)
        for(int i=tail;i<=n;i++)
        if(a[i]!=sum[tail]) zhan[++head]=a[i];
        else
        {
            tail=i+1;
            printf("%d ",a[i]);
            break;
        }
        else
        {
            printf("%d ",zhan[head--]);
        }
        if(tail>n) break;
    }
    while(head--) printf("%d ",zhan[head+1]);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM