zoukankan      html  css  js  c++  java
  • 数据结构实验之栈与队列五:下一较大值(一)

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

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

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

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

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

    Sample Input
    2
    4 12 20 15 18
    5 20 15 25 30 6
    Sample Output
    12–>20
    20–>-1
    15–>18
    18–>-1

    20–>25
    15–>25
    25–>30
    30–>-1
    6–>-1
    Hint
    本题的数据量小、限时要求低,可以不用栈来完成。
    题解:
    由于数据量小,可以直接用从这个数向后找第一个比它大的数的方法,如果找完了整个序列,在这个数的后面没有比这个数大的 ,那么就为-1,最后一个数由于后面没有数,就直接为-1

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int main()
     5 {
     6     int t,i,j,n,a[1100],b[1100],k;
     7     scanf("%d",&t);
     8     for(k=1; k<=t; k++)
     9     {
    10         int y=0;
    11         scanf("%d",&n);
    12         for(i=0; i<n; i++)scanf("%d",&a[i]);
    13         for(i=0; i<n-1; i++)
    14         {
    15             for(j=i+1; j<n; j++)
    16             {
    17                 if(a[j]>a[i])
    18                 {
    19                     b[y++]=a[j];
    20                     break;
    21 
    22                 }
    23                 else if(j==n-1&&a[j]<=a[i])
    24                     b[y++]=-1;
    25 
    26             }
    27 
    28         }
    29         b[n-1]=-1;
    30         for(i=0; i<n; i++)printf("%d-->%d
    ",a[i],b[i]);
    31         if(k!=t)printf("
    ");
    32 
    33     }
    34 
    35     return 0;
    36 }

     用栈来完成

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define stackmax 10000
     4 #define stacknum 10000
     5 typedef int Elemtype;
     6 typedef struct
     7 {
     8     Elemtype *base;
     9     Elemtype *top;
    10     int stacksize;
    11 }Sqstack;
    12 void Initstack(Sqstack *S)
    13 {
    14     S->base=(Elemtype *)malloc(stackmax*sizeof(Elemtype));
    15     if(!S->base) exit(0);
    16     S->top=S->base;
    17     S->stacksize=stackmax;
    18 }//栈的初始化
    19 void Push(Sqstack *S,int e)
    20 {
    21     if(S->top-S->base>=S->stacksize)
    22     {
    23         S->base=(Elemtype *)realloc(S->base,(S->stacksize+stacknum)*sizeof(Elemtype));
    24         if(!S->base) exit(0);
    25         S->top=S->base+S->stacksize;
    26         S->stacksize=S->stacksize+stacknum;
    27     }
    28     *(S->top)=e;
    29     S->top++;
    30 }//入栈操作
    31 int Pop(Sqstack *S)
    32 {
    33     int e;
    34     if(S->top==S->base) return -1;
    35     e=*(S->top-1);
    36     S->top--;
    37     return e;
    38 }//出栈操作
    39 void f(Sqstack *S)
    40 {
    41     int *i,*j;//设置游动指针
    42     for(i=S->base;i<=S->top-1;i++)
    43     {
    44         int f=0;//设置指示变量
    45         for(j=i+1;j<=S->top-1;j++)
    46         {
    47             if(*j>*i)//进行数值上的比较
    48             {
    49                 printf("%d-->%d
    ",*i,*j);
    50                 f=1;
    51                 break;
    52             }
    53         }
    54         if(f==0) printf("%d-->%d
    ",*i,-1);//在给定数值之后没有更大的数值
    55     }
    56 }
    57 int main()
    58 {
    59     Sqstack S;
    60     int t,i,n,a[1001];
    61     scanf("%d",&t);
    62     while(t--)
    63     {
    64         scanf("%d",&n);
    65         Initstack(&S);
    66         for(i=1;i<=n;i++)
    67         {
    68             scanf("%d",&a[i]);
    69             Push(&S,a[i]);
    70         }//将题目所给给的数据入栈
    71         f(&S);//进行比较
    72         if(t!=0) printf("
    ");//若非最后一组,多输出一行空格,要注意判断是否为最后一组的条件是t是否为零,而不是一
    73     }
    74     return 0;
    75 }

    用数组完成

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int a[1010],b[1010];
     4 int main()
     5 {
     6     int t,n,m;
     7     scanf("%d",&t);
     8     for(int j=1;j<=t;j++)
     9     {
    10         int top=0,top1=0;
    11         scanf("%d",&n);
    12         for(int i=1;i<=n;i++)
    13         {
    14             scanf("%d",&m);
    15             a[++top]=m;
    16         }//输入数据,并把它存在一个数组里
    17         for(int i=1;i<=top;i++)
    18         {
    19             int f=0;//设置指示变量
    20             for(int t=i;t<=top;t++)
    21             {
    22                 if(a[t]>a[i])
    23                 {
    24                     b[++top1]=a[t];
    25                     f=1;
    26                     break;
    27                 }//进行数值上的比较,判断是否有更大值,如果有,则把数值存在另一个数组里,便与输出
    28             }
    29             if(f==0)b[++top1]=-1;//若没有,则把-1存在另一数组里
    30         }
    31         for(int i=1;i<=top;i++)
    32         {
    33             printf("%d-->%d
    ",a[i],b[i]);
    34         }//按格式输出两个数组
    35         if(j!=t)printf("
    ");//若不是最后一组数据,要多输出一行空格
    36     }
    37     return 0;
    38 }
  • 相关阅读:
    关于自定义验证
    8086汇编 零碎杂项
    8086汇编 程序编译
    8089汇编 源程序
    8086 汇编 jmp 指令
    8089汇编 运算符指令
    8086汇编 栈操作
    8086汇编 段寄存器
    8086汇编 Debug 使用
    8086汇编 CPU 寄存结构
  • 原文地址:https://www.cnblogs.com/xiaolitongxueyaoshangjin/p/12355641.html
Copyright © 2011-2022 走看看