数据结构实验之栈与队列六:下一较大值(二)

本文介绍了一个使用栈的数据结构解决特定问题的方法:在一个整数序列中,对于每个元素,找出它后面的第一个比它大的元素。文章通过示例详细解释了算法的工作原理,并提供了一段完整的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。

Input

 输入有多组,第一行输入t(1<=t<=10),表示输入的组数;

以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。

Output

 输出有多组,每组之间输出一个空行(最后一组之后没有);

每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以-->间隔。

Example Input
2
4 12 20 15 18
5 20 15 25 30 6 
Example Output
12-->20
20-->-1
15-->18
18-->-1

20-->25
15-->25
25-->30
30-->-1
6-->-1
Hint

 本题数据量大、限时要求高,须借助栈来完成。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INITSTACKSIZE 1000
#define INCREMENT 10
#define OVERFLOW -2
#define ERROR -1
#define OK 1

typedef int Elemtype;
typedef int Statu;
typedef struct node
{
    int num;
    int lager;
}number;
typedef struct Snode
{
    Elemtype *base;
    Elemtype *top;
    int listsize;
}SqStack;

Statu InitStack(SqStack &S);
Statu PushStack(SqStack &S, Elemtype e);
Statu PopStack(SqStack &S, Elemtype &e);
Statu Compare(number a[], int n);

int main()
{
    int t, i, n;
    number  a[100010];
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        for(i = 0; i < n; i++)
        {
            scanf("%d", &a[i].num);
        }
        Compare(a, n);
        if(t)
            printf("\n");
    }
}
Statu InitStack(SqStack &S)
{
    S.base = (Elemtype *)malloc(INITSTACKSIZE * sizeof(Elemtype));
    if(!S.base)
        exit(OVERFLOW);
    S.top = S.base;
    S.listsize = INITSTACKSIZE;
    return OK;
}
Statu PopStack(SqStack &S, Elemtype &e)
{
    if(S.base == S.top)
        return ERROR;
    e = *(--S.top);
    return OK;
}
Statu PushStack(SqStack &S, Elemtype e)
{
    if(S.top - S.base >= S.listsize)
    {
        S.base = (Elemtype *)realloc(S.base, (S.listsize + INCREMENT) * sizeof(Elemtype));
        if(!S.base)
            return ERROR;
        S.top = S.base + S.listsize;
        S.listsize += INCREMENT;
    }
    *S.top++ = e;
    return OK;
}
Statu Compare(number a[], int n)
{
    int i;
    SqStack S;
    InitStack(S);
    for(i = n - 1; i >= 0; i--)
    {
        if(S.base == S.top)
        {
            PushStack(S, a[i].num);
            a[i].lager = -1;
        }
        else
        {
            while(S.base != S.top && *(S.top - 1) <= a[i].num)
                S.top--;
            if(S.base == S.top)
            {
                PushStack(S, a[i].num);
                a[i].lager = -1;
            }
            else
            {
                a[i].lager = *(S.top - 1);
                PushStack(S, a[i].num);
            }
        }
    }
    for(i = 0; i < n; i++)
    {
        printf("%d-->%d\n", a[i].num, a[i].lager);
    }
    return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值