xtuoj-stack

来源:互联网 发布:c语言指针 p跟p的区别 编辑:程序博客网 时间:2024/06/06 07:17
/*
Description
题目描述

一个栈,支持三种操作:

    PUSH x ,将x压入栈中
    POP,将栈顶弹掉
    MIN,输出当前栈中最小值,如果栈为空,输出NULL

给你一个操作列表,请模拟其操作过程。

输入

第一行是一个整数K,表示样例的个数。 每个样例的第一行是一个整数M,
表示操作命令的数目1≤M≤100,000。 以后的M行,每行一条命令,
栈中所有值处于[0,1000000000]之间。
输出

每个MIN命令输出一个结果,占一行。
样例输入

2
6
MIN
PUSH 2
PUSH 1
MIN
POP
MIN
6
PUSH 3
MIN
PUSH 1
MIN
PUSH 2
MIN

样例输出

NULL
1
2
3
1
1

用两个技巧减少时间。
第一,维护一个最小数数组,使时间为线性复杂度
第二,sscanf()来获取command中的x
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100001
int Stack[N],M[N];
void initStack()
{
    memset(Stack,0,N*sizeof(int));
    memset(M,0,N*sizeof(int));
    M[0]=0x7fffffff;//这里曾经犯过错误,必须比10亿大才行,否则第一个数如果比他大程序就错了
}
void stackOperation(int m)
{
    char cmd[19],s[5];
    int x,sp=0,i=0;
    while(m--){
        gets(cmd);
        if(strcmp(cmd,"MIN")==0){
            if(sp!=0)printf("%d\n",M[i]);
            else puts("NULL");
        }
        else if(strcmp(cmd,"POP")==0&&sp>0){
            if(Stack[sp]==M[i])
                i--;
            sp--;
        }
        else{
            sscanf(cmd,"%s %d",s,&x);
            if(strcmp(s,"PUSH")==0&&sp<N){
                Stack[++sp]=x;
                if(x<M[i])M[++i]=x;
            }
        }
    }//while m--
}
int main()
{
    int cases,m;
    scanf("%d ",&cases);
    while(cases--){
        initStack();
        scanf("%d ",&m);
        stackOperation(m);
    }
    return 0;
}

0 0
原创粉丝点击