数据结构实验之栈六:下一较大值(二)
Time Limit: 150ms Memory limit: 8000K 有疑问?点这里^_^
题目描述
对于包含n(1<=n<=100000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。
输入
输入有多组,第一行输入t(1<=t<=10),表示输入的组数;
以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。
输出
输出有多组,每组之间输出一个空行(最后一组之后没有);
每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以-->间隔。
示例输入
2
4 12 20 15 18<span style="font-family: Arial, Helvetica, sans-serif;">5 20 15 25 30 6 </span>
示例输出
12-->20
20-->-1
15-->18
18-->-1
20-->25
15-->2525-->3030-->-16-->-1
提示
本题数据量大、限时要求高,须借助栈来完成。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stack>
#define N 100005
using namespace std;
struct node
{
int num,id,next; //next是下一较大值,初始值为-1;
}a[N];
int main()
{
int T;
int n, i;
scanf("%d",&T);
while(T--)
{
stack<struct node>s;
while(!s.empty()) //栈清空;
{
s.pop();
}
scanf("%d",&n);
for( i = 1;i <= n;i++ )
{
scanf("%d",&a[i].num);
a[i].id = i;
a[i].next = -1; //赋初始值-1;
if( s.empty() ) //若栈空,则进栈;
{
s.push(a[i]);
}
else
{
while(!s.empty()) //一直处理到栈空;
{
struct node t;
t = s.top();
if(t.num<a[i].num)//若栈顶元小于该值,则更新栈顶的下一个较大值;
{
a[t.id].next = a[i].num;
s.pop();
}
else//否则跳出,因为栈顶之前的元素的下一个较大值不可能是a[i].num ;
{
break;
}
}
s.push(a[i]);//处理此时的a[i].next;
}
}
for( i = 1;i <= n;i++ )
{
printf("%d-->%d\n",a[i].num,a[i].next);
}
if( T>0 )printf("\n");
}
return 0;
}