数据结构实验之栈与队列六:下一较大值(二)
Description
对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。
Input
输入有多组,第一行输入t(1<=t<=10),表示输入的组数;
以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。
Output
输出有多组,每组之间输出一个空行(最后一组之后没有);
每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以-->间隔。
Sample
Input
2 4 12 20 15 18 5 20 15 25 30 6
Output
12-->20 20-->-1 15-->18 18-->-1 20-->25 15-->25 25-->30 30-->-1 6-->-1
Hint
本题数据量大、限时要求高,须借助栈来完成。
1 #include<stdio.h> 2 3 4 int a[100001]; 5 int b[100001];//储存对应元素的最近的最大数 6 int st[100001];//用栈来储存一个递增的序列 7 int main() 8 { 9 int t; 10 scanf("%d",&t); 11 while(t--) 12 { 13 int n; 14 scanf("%d",&n); 15 int i; 16 for(i=0;i<n;i++) 17 scanf("%d",&a[i]); 18 int top = 0; 19 b[n-1] = -1; 20 for(i=n-2;i>=0;i--) 21 { 22 if(a[i+1]>a[i]) 23 { 24 st[top++] = a[i+1];//递增进栈 25 b[i] = a[i+1]; 26 } 27 else 28 { 29 while(top!=0)//栈不是空栈 30 { 31 if(a[i]>=st[top-1]) 32 top--; 33 else 34 { 35 b[i] = st[top-1]; 36 st[top++] = a[i]; 37 break; 38 } 39 } 40 if(!top) 41 { 42 b[i] = -1; 43 st[top++] = a[i]; 44 } 45 } 46 } 47 for(i=0;i<n;i++) 48 { 49 printf("%d-->%d\n",a[i],b[i]); 50 } 51 if(t) 52 printf("\n"); 53 } 54 return 0; 55 }

浙公网安备 33010602011771号