http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=1466&cid=1182
题目描述
想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
现在给你一系列的操作,请输出最后队列的状态;
命令格式:
LIN X X表示一个整数,命令代表左边进队操作;
RIN X 表示右边进队操作;
ROUT
LOUT 表示出队操作;
输入
第一行包含一个整数M(M<=10000),表示有M个操作;
以下M行每行包含一条命令;
命令可能不合法,对于不合法的命令,请在输出中处理;
输出
输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
以下若干行处理不合法的命令(如果存在);
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;
示例输入
8 LIN 5 RIN 6 LIN 3 LOUT ROUT ROUT ROUT LIN 3
示例输出
3 7 ERROR
queue函数真的很好用。。。。。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<queue> 6 using namespace std ; 7 int main() 8 { 9 deque<int>q ; 10 int M ; 11 scanf("%d",&M) ; 12 char ch[21] ; 13 int a ; 14 int flag[100001] ; 15 memset(flag,0,sizeof(flag)) ; 16 for(int i = 1 ; i <= M ; i++) 17 { 18 scanf("%s",ch) ; 19 if(strcmp(ch,"LIN") == 0) 20 { 21 scanf("%d",&a) ; 22 q.push_front(a) ; 23 } 24 else if(strcmp(ch,"RIN") == 0) 25 { 26 cin>>a ; 27 q.push_back(a) ; 28 } 29 else if(strcmp(ch,"LOUT") == 0) 30 { 31 if(q.empty()) 32 { 33 flag[i] = 1 ; 34 35 } 36 else 37 q.pop_front() ; 38 } 39 else if(strcmp(ch,"ROUT") == 0) 40 { 41 if(q.empty()) 42 flag[i] = 1 ; 43 else 44 q.pop_back() ; 45 } 46 } 47 int aa = q.front() ; 48 q.pop_front() ; 49 printf("%d",aa) ; 50 while(!q.empty()) 51 { 52 int aa = q.front() ; 53 q.pop_front() ; 54 printf(" %d",aa) ; 55 } 56 cout<<endl ; 57 for(int i = 1 ; i <= M ; i++) 58 { 59 if(flag[i]) 60 cout<<i<<" ERROR"<<endl ; 61 } 62 return 0 ; 63 }