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;
}
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
- xtuoj-stack
- xtuoj-grid
- xtuoj-年利率
- XTUOJ 1168 填颜色
- xtuoj-立方和
- xtuoj 1246Heartstone
- XTUOJ-1058 青蛙王子的一种实现
- xtuoj 1187 Double Maze (2014XTU校赛)
- XTUOJ 1142 Collatz Conjecture(数论)
- XTUOJ 1144 Echo(字符串的处理)
- XTUOJ 1173 Five Tiger(模拟)
- xtuoj-who is the Kth number
- XTUOJ 程序设计实践II-2017(部分)
- stack
- stack
- stack
- stack
- Stack
- 怪胎:Android开发ImageView图片无法显示
- C语言实现数据复制
- 字符串 (扫一遍 + 计数)
- C语言写入文件
- 【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)
- xtuoj-stack
- 快速排序过程的优化(续)
- 如何启动eclipse时提示选择工作空间||删除workspace空间的目录
- easymock教程-目录
- Apache虚拟目录和虚拟主机的配置
- 关于Android UI布局如何适应各种分辨率手机的问题
- Struts2框架提供的结果类型及result的name属性和type属性
- POJ 1125Stockbroker Grapevine(floyd最短路)
- 使用import简化spring的配置文件