您的位置:首页 > 理论基础 > 数据结构算法

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

2018-02-03 15:40 253 查看


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

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

01
#include<stdio.h>
02
#include<stdlib.h>
03
#include<string.h>
04
#define
false 0
05
#define
true 1
06
int
stacksize;
07
typedef
int
elemtype;
08
typedef
int
status;
09
typedef
struct
10
{
11
elemtype
date[1010];
12
int
top;
13
}
seqstack;
14
void
initstack(seqstack
*s)
15
{
16
(*s).top
= 0;
17
}
18
status
stackfull(seqstack s)
19
{
20
if
(s.top
== stacksize)
return
false
;
21
return
true
;
22
}
23
void
push(seqstack
*s, elemtype p)
24
{
25
if
(!stackfull(*s))
26
{
27
printf
(
"overflow\n"
);
28
}
29
else
30
{
31
(*s).date[(*s).top]
= p;
32
(*s).top++;
33
}
34
}
35
status
stackempty(seqstack s)
36
{
37
if
(s.top
== 0)
return
false
;
38
return
true
;
39
}
40
status
pop(seqstack *s, elemtype *p)
41
{
42
if
(!stackempty(*s))
return
false
;
43
(*s).top--;
44
*p
= (*s).date[(*s).top];
45
return
true
;
46
}
47
int
main()
48
{
49
int
t,
n, i, a[100010], p, b[100010];
50
scanf
(
"%d"
,
&t);
51
52
while
(t--)
53
{
54
seqstack
s;
55
initstack(&s);
56
scanf
(
"%d"
,
&n);
57
stacksize
= n;
58
for
(i
= 0; i < n; i++)
59
{
60
scanf
(
"%d"
,
&a[i]);
61
}
62
push(&s,
a[n-1]);
63
b[n-1]
= -1;
64
for
(i
= n-2; i >= 0; i--)
65
{
66
if
(a[i]
< s.date[s.top-1])
67
{
68
b[i]
= s.date[s.top-1];
69
push(&s,
a[i]);
70
}
71
else
72
{
73
while
(a[i]
>= s.date[s.top-1] && stackempty(s))
74
pop(&s,
&p);
75
if
(!stackempty(s))
76
b[i]
= -1;
77
else
b[i]
= s.date[s.top-1];
78
push(&s,
a[i]);
79
}
80
}
81
for
(i
= 0; i < n; i++)
82
{
83
printf
(
"%d-->%d\n"
,
a[i], b[i]);
84
}
85
if
(t
!= 0)
printf
(
"\n"
);
86
}
87
return
0;
88
}
89
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: