/*
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;
}
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;
}