Problem Description
想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
命令格式:
LIN X X表示一个整数,命令代表左边进队操作;
RIN X 表示右边进队操作;
ROUT
LOUT 表示出队操作;
Input
第一行包含一个整数M(M<=10000),表示有M个操作;
命令可能不合法,对于不合法的命令,请在输出中处理;
Output
输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开;
对于不合法的命令,请输出一行X ERROR
其中X表示是第几条命令;
Sample Input
8 LIN 5 RIN 6 LIN 3 LOUT ROUT ROUT ROUT LIN 3
Sample Output
3 7 ERROR
/* deque<ll>q;//定义一个双向队列q,类型为long long q.push_front(a);//将a从队首插入队列 q.push_back(a);//将a从队尾插入队列 q.pop_front();//队首弹掉一个元素 q.pop_back();//队尾弹出一个元素 a=q.front();//返回队首元素 a=q.back();//返回队尾元素 a=q.size();//返回双向队列的大小 a=q.empty();//判断双向队列是否为空,为空返回1,不为空返回0 deque<ll>p(q);//将队列q复制一个新的队列p q.clear(); //将队列q清空 */ #include<iostream> #include<cstdio> #include<vector> #include<queue> #include<string.h> using namespace std; char str[10]; int main() { int m,a; deque<int> q; vector<int> v; scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%s",str); if(strcmp(str,"LIN")==0){ scanf("%d",&a); q.push_front(a); }else if(strcmp(str,"RIN")==0){ scanf("%d",&a); q.push_back(a); }else if(strcmp(str,"LOUT")==0){ if(q.empty()) v.push_back(i); else q.pop_front(); }else if(strcmp(str,"ROUT")==0){ if(q.empty()) v.push_back(i); else q.pop_back(); } } bool flag=false; while(!q.empty()){ if(flag){ printf(" %d",q.front()); } else{ printf("%d",q.front()); flag=true; } q.pop_front(); } printf("\n"); int len=v.size(); for(int i=0;i<len;i++){ printf("%d ERROR\n",v[i]); } return 0; } /*************************************************** Result: Accepted Take time: 4ms Take Memory: 200KB Submit time: 2018-05-12 ****************************************************/