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

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

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

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

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

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

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

20–>25
15–>25
25–>30
30–>-1
6–>-1
Hint
本题的数据量小、限时要求低,可以不用栈来完成。
题解:
由于数据量小,可以直接用从这个数向后找第一个比它大的数的方法,如果找完了整个序列,在这个数的后面没有比这个数大的 ,那么就为-1,最后一个数由于后面没有数,就直接为-1

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main()
 5 {
 6     int t,i,j,n,a[1100],b[1100],k;
 7     scanf("%d",&t);
 8     for(k=1; k<=t; k++)
 9     {
10         int y=0;
11         scanf("%d",&n);
12         for(i=0; i<n; i++)scanf("%d",&a[i]);
13         for(i=0; i<n-1; i++)
14         {
15             for(j=i+1; j<n; j++)
16             {
17                 if(a[j]>a[i])
18                 {
19                     b[y++]=a[j];
20                     break;
21 
22                 }
23                 else if(j==n-1&&a[j]<=a[i])
24                     b[y++]=-1;
25 
26             }
27 
28         }
29         b[n-1]=-1;
30         for(i=0; i<n; i++)printf("%d-->%d
",a[i],b[i]);
31         if(k!=t)printf("
");
32 
33     }
34 
35     return 0;
36 }

 用栈来完成

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define stackmax 10000
 4 #define stacknum 10000
 5 typedef int Elemtype;
 6 typedef struct
 7 {
 8     Elemtype *base;
 9     Elemtype *top;
10     int stacksize;
11 }Sqstack;
12 void Initstack(Sqstack *S)
13 {
14     S->base=(Elemtype *)malloc(stackmax*sizeof(Elemtype));
15     if(!S->base) exit(0);
16     S->top=S->base;
17     S->stacksize=stackmax;
18 }//栈的初始化
19 void Push(Sqstack *S,int e)
20 {
21     if(S->top-S->base>=S->stacksize)
22     {
23         S->base=(Elemtype *)realloc(S->base,(S->stacksize+stacknum)*sizeof(Elemtype));
24         if(!S->base) exit(0);
25         S->top=S->base+S->stacksize;
26         S->stacksize=S->stacksize+stacknum;
27     }
28     *(S->top)=e;
29     S->top++;
30 }//入栈操作
31 int Pop(Sqstack *S)
32 {
33     int e;
34     if(S->top==S->base) return -1;
35     e=*(S->top-1);
36     S->top--;
37     return e;
38 }//出栈操作
39 void f(Sqstack *S)
40 {
41     int *i,*j;//设置游动指针
42     for(i=S->base;i<=S->top-1;i++)
43     {
44         int f=0;//设置指示变量
45         for(j=i+1;j<=S->top-1;j++)
46         {
47             if(*j>*i)//进行数值上的比较
48             {
49                 printf("%d-->%d
",*i,*j);
50                 f=1;
51                 break;
52             }
53         }
54         if(f==0) printf("%d-->%d
",*i,-1);//在给定数值之后没有更大的数值
55     }
56 }
57 int main()
58 {
59     Sqstack S;
60     int t,i,n,a[1001];
61     scanf("%d",&t);
62     while(t--)
63     {
64         scanf("%d",&n);
65         Initstack(&S);
66         for(i=1;i<=n;i++)
67         {
68             scanf("%d",&a[i]);
69             Push(&S,a[i]);
70         }//将题目所给给的数据入栈
71         f(&S);//进行比较
72         if(t!=0) printf("
");//若非最后一组,多输出一行空格,要注意判断是否为最后一组的条件是t是否为零,而不是一
73     }
74     return 0;
75 }

用数组完成

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int a[1010],b[1010];
 4 int main()
 5 {
 6     int t,n,m;
 7     scanf("%d",&t);
 8     for(int j=1;j<=t;j++)
 9     {
10         int top=0,top1=0;
11         scanf("%d",&n);
12         for(int i=1;i<=n;i++)
13         {
14             scanf("%d",&m);
15             a[++top]=m;
16         }//输入数据,并把它存在一个数组里
17         for(int i=1;i<=top;i++)
18         {
19             int f=0;//设置指示变量
20             for(int t=i;t<=top;t++)
21             {
22                 if(a[t]>a[i])
23                 {
24                     b[++top1]=a[t];
25                     f=1;
26                     break;
27                 }//进行数值上的比较,判断是否有更大值,如果有,则把数值存在另一个数组里,便与输出
28             }
29             if(f==0)b[++top1]=-1;//若没有,则把-1存在另一数组里
30         }
31         for(int i=1;i<=top;i++)
32         {
33             printf("%d-->%d
",a[i],b[i]);
34         }//按格式输出两个数组
35         if(j!=t)printf("
");//若不是最后一组数据,要多输出一行空格
36     }
37     return 0;
38 }
原文地址:https://www.cnblogs.com/xiaolitongxueyaoshangjin/p/12355641.html