sdut oj3333 数据结构实验之栈六:下一较大值(二)

来源:互联网 发布:la域名注册查询 编辑:程序博客网 时间:2024/06/04 18:20

题目链接:点击打开链接

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

Time Limit: 150MS Memory limit: 8000K

题目描述

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

输入

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

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

输出

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

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

示例输入

24 12 20 15 185 20 15 25 30 6 

示例输出

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

提示

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

 

 

 

手写的栈:

代码实现:

#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>using namespace std;#define stackmax 100010///定义结构体struct node{    int num, id, next;};typedef struct{    node *top;    node *base;    int stacksize;}Sqstack;///初始化栈int initStack(Sqstack &s){    s.base=(node*)malloc(stackmax*sizeof(node));    if(!s.base)        return -1;    s.top=s.base;    s.stacksize=stackmax;    return 0;}///栈的清空void Clear(Sqstack &s){    s.top=s.base;}void push(Sqstack &s,node &e){    *(s.top++)=e;}void pop(Sqstack &s){    s.top--;}int isempty(Sqstack &s){    if(s.top==s.base)        return 1;    return 0;}node Gettop(Sqstack &s){    return *(s.top-1);}node a[stackmax];int main(){    Sqstack s;    initStack(s);    int t,n;    scanf("%d",&t);    for(int i=1;i<=t;i++)    {        while(isempty(s)==0)///对栈进行清空操作            pop(s);        if(i>1)            printf("\n");///控制空行的输出        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i].num);            a[i].id=i;            a[i].next=-1;            if(isempty(s)==1)                push(s,a[i]);            else            {                while(isempty(s)==0)///栈不为空时                {                    node b;                    b=Gettop(s);                    if(b.num<a[i].num)///如果栈顶元素大于该元素,则将该元素赋给栈顶元素的next                    {                        a[b.id].next=a[i].num;                        pop(s);///栈顶元素出栈                    }                    else                        break;                }                push(s,a[i]);///不管怎样,判断完之后让该元素进栈            }        }        for(int i=1;i<=n;i++)///输出            printf("%d-->%d\n",a[i].num,a[i].next);    }    return 0;}

 

或者采用STL做法:


 

#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stack>using namespace std;struct node///运用结构体记录{    int num;    int id;    int next;};node a[100100];int main(){    int t,n;    stack<node> S;///定义结构体的栈    scanf("%d",&t);    for(int i = 0; i < t; i++)    {        while(!S.empty())///对栈进行清空            S.pop();        if(i > 0)            printf("\n");        scanf("%d",&n);        for(int i = 0; i < n; i++)        {            scanf("%d",&a[i].num);            a[i].id = i;            a[i].next = -1;            if(S.empty())                S.push(a[i]);            else            {                while(!S.empty())                {                    node b;                    b = S.top();                    if(b.num < a[i].num)                    {                        a[b.id].next = a[i].num;                        S.pop();                    }                    else                        break;                }                S.push(a[i]);            }        }        for(int i = 0;i < n;i++)            printf("%d-->%d\n",a[i].num,a[i].next);    }    return 0;}


 

0 0
原创粉丝点击