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
{
    char data;
    struct node *next;
}Node;

typedef struct stack
{
    Node *base,*top;
}Stack;

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,char x)//入站
{
    Node *p = newnode();
    p->data = x;
    p->next = t->top->next;
    t->top->next = p;
    t->base = p;
}

char 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()
{
    char s[55];
    Stack *t;
    int n,i;
    t = Newstack();
    while(gets(s)!=NULL)
    {
        n = strlen(s);
        for(i=0;i<n;i++)
        {
            if(s[i]=='('||s[i]=='{'||s[i]=='[')
                push(t,s[i]);
            else if(s[i]==')'||s[i]=='}'||s[i]==']')
            {
                if(empty(t))
                    break;
                else
                {
                    if(s[i]==')'&&top(t)!='(')
                        break;
                    else if(s[i]=='}'&&top(t)!='{')
                        break;
                    else if(s[i]==']'&&top(t)!='[')
                        break;
                    else
                        pop(t);
                }
            }
        }
        if(i!=n)
            printf("no\n");
        else
        {
            if(!empty(t))
                printf("no\n");
            else
                printf("yes\n");
        }
        del(t);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/luoxiaoyi/p/9747985.html