Accept: 240Submit: 904
Time Limit: 1000 mSecMemory Limit : 32768 KB
Problem Description
Tom博士最近研发了一个自动机,该自动机能够同时处理n个队列。其中,队列的编号为1..n。给定m个操作,模拟该自动机的工作状态。
第一行有2个整数n,m(1≤n, m≤10,000),表示自动机能处理n个队列,接下来m行每行一条操作指令。
每条指令的格式如下:指令 | 指令说明 |
---|---|
INIT | 将自动机初始化,此时所有的队列清空。 |
PUSH id val | 把整数val加入到编号id的队列的尾部。 |
POP id val | 输出并删除编号id的队列的队首元素,如果队列为空,则输出“NULL”。 |
在每条指令中,id的编号在1..n中,val的取值范围为-2 31~2 31。输入数据保证操作的第一条指令都是是INIT。
Input
本题有多组输入数据,你必须处理到EOF为止。
Output
请对输入数据中每条POP指令的结果依次输出一行结果。
Sample Input
3 12 INIT PUSH 1 100 POP 2 PUSH 3 300 PUSH 1 200 PUSH 2 -5 POP 2 PUSH 2 -10 POP 1 INIT PUSH 1 7 POP 1
Sample Output
NULL -5 100 7
//不想用STL里面的deque, 如果用deque来做的话,应该代码会挺简单的,
//这里用一种很土的方法做的,字符串(string),锻炼下自己。
#include<iostream> #include<string> using namespace std; string str[10001]; int main() { string va; int n,m,i,j,id,start,end; char s[5]; while(scanf("%d%d",&n,&m)!=EOF) { scanf("%*s"); memset(str,'/0',sizeof(str)); for(i=0;i<m-1;i++) { scanf("%s",s); if(strcmp(s,"PUSH")==0) { scanf("%d",&id); cin>>va; if(str[id].size()==0) str[id]='S'+va+'E'; else str[id]='S'+va+'E'+str[id]; } else if(strcmp(s,"POP")==0) { scanf("%d",&id); if(str[id].find('S')==-1) printf("NULL/n"); else { start=str[id].find_last_of('S'); end=str[id].find_last_of('E'); for(j=start+1;j<end;j++) printf("%c",str[id][j]); printf("/n"); str[id][start]='/0'; str[id][end]='/0'; } } else memset(str,'/0',sizeof(str)); } } return 0; }