数据结构实验之栈六:下一较大值(二)【OJ-3333】【自己写的封装的栈代码】

题目描述

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

输入

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

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

输出

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

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


之所以写这篇博客主要是想记录一下手写的栈。

示例输入

2
4 12 20 15 18
5 20 15 25 30 6 

示例输出

12-->20
20-->-1
15-->18
18-->-1
 
 
20-->25
15-->25
25-->30
30-->-1
6-->-1

  1. <span style="font-weight: normal;">#include <iostream>  
  2. #include <algorithm>  
  3. #include <cstring>  
  4. #include <cstdio>  
  5. #define stack_init_size 101000  
  6. using namespace std;  
  7. int n;  
  8. typedef struct node       //定义结构体  
  9. {  
  10.     int num,id,next;  
  11. }Node;  
  12. struct Stack                     //封装的栈  
  13. {  
  14.     Node *base,*top;      //栈底指针和栈顶指针  
  15.     void clear()                  //栈的清空,使栈顶指针重新回到栈底  
  16.     {  
  17.         top = base;  
  18.     }  
  19.     void InitStack()            //栈的初始化  
  20.     {  
  21.         base=(Node *)malloc(stack_init_size*sizeof(Node));  
  22.         top=base;  
  23.     }  
  24.     Node GetTop()             //得到栈顶元素  
  25.     {  
  26.         Node e;  
  27.         e=*(top-1);                //栈顶指针指的是栈尾元素的下一位  
  28.         return e;  
  29.     }  
  30.   
  31.     bool isempty()              //判断栈是否为空  
  32.     {  
  33.         return top == base;  
  34.     }  
  35.     void Push(Node e)       //插入栈顶元素  
  36.     {  
  37.         *top++=e;  
  38.     }  
  39.     void Pop()                      //删除栈顶元素  
  40.     {  
  41.         top--;  
  42.     }  
  43. }ss;  
  44.   
  45. Node a[100010];  
  46.   
  47. int main()  
  48. {  
  49.    int t;  
  50.    scanf("%d",&t);  
  51.    ss.InitStack();  
  52.    for(int k=1;k<=t;k++)  
  53.    {  
  54.        ss.clear();                    //对于每组数据记得要清空  
  55.        if(k>1)  
  56.         printf("\n");  
  57.        scanf("%d",&n);  
  58.        for(int i=1;i<=n;i++)  
  59.        {  
  60.            scanf("%d",&a[i].num);  
  61.            a[i].id=i;  
  62.            a[i].next=-1;  
  63.            if(ss.isempty())  
  64.            {  
  65.                ss.Push(a[i]);  
  66.            }  
  67.            else  
  68.            {  
  69.                while(!ss.isempty())  
  70.                {  
  71.                    Node b;  
  72.                    b=ss.GetTop();  
  73.                    if(b.num<a[i].num)  
  74.                    {  
  75.                     a[b.id].next=a[i].num;  
  76.                     ss.Pop();  
  77.                    }  
  78.                    else  
  79.                     break;  
  80.                }  
  81.                ss.Push(a[i]);  
  82.            }  
  83.        }  
  84.        for(int i=1;i<=n;i++)  
  85.         printf("%d-->%d\n",a[i].num,a[i].next);  
  86.    }  
  87.     return 0;  
  88. }</span>  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值