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

来源:互联网 发布:java resultset 行数 编辑:程序博客网 时间:2024/05/17 16:53

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

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic Discuss

Problem Description

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

Input

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

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

Output

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

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

Example Input

24 12 20 15 185 20 15 25 30 6 

Example Output

12-->2020-->-115-->1818-->-120-->2515-->2525-->3030-->-16-->-1

Hint

 本题的数据量小、限时要求低,可以不用栈来完成。

这道题在开始输入的时候就进行对数据进行处理,当输入每一组数据时,当栈为空时直接把该数据进栈,输入数据时不为空,则进行和栈中的数据进行比较....代码中有详解

#include <bits/stdc++.h>using namespace std;//用来声明s栈 struct sqstack{    int num;//用于记录输入的每一组数据的大小,从而好与后面数据进行比较大小    int id,next;//id是为了记录输入的这个数据是这组数据的第几个,从而便于对a数组中的next的值进行赋值时找到是数组中在那个位置上(id位置)           //next是用来存储比num数值大的那一个数};int compear(){    sqstack a[1000],p,t;//a数组到最后是用来进行输出的对象    stack<struct sqstack>s;//s栈    int n;    scanf("%d",&n);    for(int i=0;i<n;++i)    {        cin>>a[i].num;        a[i].id=i;        a[i].next=-1;//后面会对其进行更改值,代表比他大的第一个值,如果没有改变说明这组数据中没有比他大的        p=a[i];        if(s.empty())//遇到空时直接对其进行进栈            s.push(p);        else        {            while(!s.empty())//不为空时,同时如果栈中有多个数据时会进行循环,直到为空或者找不到比这个数值大的            {                t=s.top();//栈顶元素                 if(p.num>t.num)                {                    a[t.id].next=p.num;//t.id代表栈顶元素在这组数据的位置,同时也代表在a数组中代表的位置,在此把比他大的值存入到next中,                    s.pop();//已经为a[i-1]找到了第一个比他大的值,所以出栈就行啦,                }                else                    break;//如果找不到比t.num大的值得话,最终就会循环            }            s.push(p);//a[i]不比a[i-1]大的话就结束,再把a[i]进栈        }    }    for(int i=0;i<n;++i)    printf("%d-->%d\n",a[i].num,a[i].next);    return 0;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        compear();        if(t)            printf("\n");    }}


阅读全文
0 0