zoukankan      html  css  js  c++  java
  • SDUT-3332&3333_数据结构实验之栈与队列五:下一较大值

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

    Time Limit: 150 ms Memory Limit: 8000 KiB

    Problem Description

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

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

    由于3333是3332的升级版,所以直接放了3333的题解。
    将数字与栈顶元素比较,如果栈顶元素小于该数字,则说明这个数字是栈顶元素的下一最大值。
    直到栈顶元素大于该数字或者栈为空时,将该数字入栈。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct node
    {
        int data;
        struct node *next;
    }Node;
    
    typedef struct stack
    {
        Node *base,*top;
    }Stack;
    
    struct num
    {
        int data,next;
    }s[100050];
    
    Node *newnode()//建立节点
    {
        Node *t;
        t = (Node *)malloc(sizeof(Node));
        t->next = NULL;
        return t;
    };
    
    Stack *Newstack()//建立新栈
    {
        Stack *t;
        t = (Stack *)malloc(sizeof(Stack));
        t->top = newnode();
        t->base = t->top;
        return t;
    }
    
    void push(Stack *t,int x)//入站
    {
        Node *p = newnode();
        p->data = x;
        p->next = t->top->next;
        t->top->next = p;
        t->base = p;
    }
    
    int top(Stack *t)//询问栈顶元素
    {
        return t->top->next->data;
    }
    
    void pop(Stack *t)//出栈
    {
        Node *p;
        p = t->top->next;
        t->top->next = t->top->next->next;
        free(p);
    }
    
    int empty(Stack *t)//询问栈是否为空
    {
        if(t->top->next==NULL)
            return 1;
        return 0;
    }
    
    void del(Stack *t)//清空栈
    {
        while(!empty(t))
            pop(t);
    }
    
    int main()
    {
        int i,n,k;
        Stack *t;
        t = Newstack();
        scanf("%d",&k);
        while(k--)
        {
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&s[i].data);
                s[i].next = -1;
            }
            for(i=0;i<n;i++)
            {
                if(empty(t))
                    push(t,i);
                else
                {
                    while(!empty(t)&&s[i].data>s[top(t)].data)
                    {
                        s[top(t)].next = s[i].data;
                        pop(t);
                    }
                    push(t,i);
                }
            }
            for(i=0;i<n;i++)
                printf("%d-->%d
    ",s[i].data,s[i].next);
            del(t);
            if(k!=0)
                printf("
    ");
        }
        return 0;
    }
    
    

    线性表

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct node
    {
        int data,next;
    }s[100050];
    
    typedef struct Static
    {
        int *top,*base;
    }Static;
    
    Static newStatic()
    {
        Static t;
        t.top = (int *)malloc(100050*sizeof(int));
        t.base = t.top;
        return t;
    }
    
    int top(Static t)
    {
        return *(t.top-1);
    }
    
    void pop(Static *t)
    {
        t->top--;
    }
    
    void push(Static *t,int x)
    {
        *(t->top++) = x;
    }
    
    int empty(Static t)
    {
        if(t.base==t.top)
            return 1;
        return 0;
    }
    
    void clear(Static *t)
    {
        while(!empty(*t))
            pop(t);
    }
    
    int main()
    {
        Static k;
        int n,i,t;
        scanf("%d",&t);
        k = newStatic();
        while(t--)
        {
            if(!empty(k))
                clear(&k);
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&s[i].data);
                s[i].next = -1;
                while(!empty(k)&&s[i].data>s[top(k)].data)
                {
                    s[top(k)].next = s[i].data;
                    pop(&k);
                }
                push(&k,i);
            }
            for(i=0;i<n;i++)
                printf("%d-->%d
    ",s[i].data,s[i].next);
            if(t!=0)
                printf("
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    利用 windbg 脚本动态调试代码
    GetHotkeys 通过驱动获取系统热键 [ 顺便写了 SSDT + Shadow SSDT ]
    获取系统热键链表windbg脚本 GetHotkeys windbg script
    利用SetSysColor函数实现主题修改
    Javascript文件夹选择框的两种解决方案
    Javascript使用AjaxPro构建自动补全,同时自动生成待输行【原创】
    在UpdatePanel中弹出对话框
    JS动态创建表格比较【转】
    JS精美日历时间控件
    myeclipse快捷键大全【转】
  • 原文地址:https://www.cnblogs.com/luoxiaoyi/p/9747985.html
Copyright © 2011-2022 走看看