SDUT 數據結構實驗之棧六:下一較大值(二)

題目描述

對於包含n(1<=n<=100000)個整數的序列,對於序列中的每一元素,在序列中查找其位置之後第一個大於它的值,如果找到,輸出所找到的值,否則,輸出-1。

輸入

輸入有多組,第一行輸入t(1<=t<=10),表示輸入的組數;

以後是 t 組輸入:每組先輸入n,表示本組序列的元素個數,之後依次輸入本組的n個元素。

輸出

輸出有多組,每組之間輸出一個空行(最後一組之後沒有);

每組輸出按照本序列元素的順序,依次逐行輸出當前元素及其查找結果,兩者之間以-->間隔。

示例輸入

2
4 12 20 15 18
5 20 15 25 30 6 

示例輸出

12-->20
20-->-1
15-->18
18-->-1
 
20-->25
15-->25
25-->30
30-->-1
6-->-1

提示

本題數據量大、限時要求高,須藉助棧來完成。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define N 100100
using namespace std;

struct node//運用結構體來記錄數據
{
    int num,id,next;
};
struct node a[N];
int main()
{
    int t;
    scanf("%d",&t);
    stack <struct node > p;//定義結構體的棧
    for(int i=1; i<=t; i++)
    {
        while(!p.empty())//對棧進行清空
        {
            p.pop();
        }
        int n;
        if(i>1)//用來輸出空格
            printf("\n");
        scanf("%d",&n);
        for(int j=1; j<=n; j++)
        {
            scanf("%d",&a[j].num);
            a[j].id=j;
            a[j].next=-1;
            if(p.empty())
            {
                p.push(a[j]);
            }
            else//如果棧不爲空
            {
                while(!p.empty())
                {
                    struct node b;
                    b=p.top();//拿出棧頂的元素
                    if(b.num<a[j].num)//與棧頂元素比較,如果比棧頂元素大,記錄進入next.
                    {
                        a[b.id].next=a[j].num;
                        p.pop();
                    }
                    else
                        break;
                }
                p.push(a[j]);
            }
        }
        for(int j=1; j<=n; j++)
        {
            printf("%d-->%d\n",a[j].num,a[j].next);
        }
    }

    return 0;
}


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章