双向队列
Time Limit: 1000MS Memory Limit: 65536KBProblem Description
想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。 现在给你一系列的操作,请输出最后队列的状态; 命令格式: LIN X X表示一个整数,命令代表左边进队操作; RIN X 表示右边进队操作; ROUT LOUT 表示出队操作;
Input
第一行包含一个整数M(M<=10000),表示有M个操作; 以下M行每行包含一条命令; 命令可能不合法,对于不合法的命令,请在输出中处理;
Output
输出的第一行包含队列进行了M次操作后的状态,从左往右输出,每两个之间用空格隔开; 以下若干行处理不合法的命令(如果存在); 对于不合法的命令,请输出一行X ERROR 其中X表示是第几条命令;
Example Input
8 LIN 5 RIN 6 LIN 3 LOUT ROUT ROUT ROUT LIN 3Example Output
3 7 ERRORHint
Author
#include<stdio.h> #include<string.h> #define N 30000 int main() { char s[20]; int a[N], front, near, x, b[N], t, i, j; front = near = 15000; int n; scanf("%d", &n); t = 0; for(i = 1; i <= n; i++) { scanf("%s", s); if(strcmp(s, "LIN") == 0) { scanf("%d", &x); a[front--] = x; } else if(strcmp(s, "RIN") == 0) { scanf("%d", &x); a[++near] = x; } else if(strcmp(s, "LOUT") == 0) { if(front == near) { b[t++] = i; } else { front++; } } else if(strcmp(s, "ROUT") == 0) { if(front == near) { b[t++] = i; } else { near--; } } } if(front != near) { for(j = front + 1; j <= near; j++) { if(j == near) { printf("%d\n", a[j]); } else { printf("%d ", a[j]); } } } if(t != 0) { for(j = 0; j <= t - 1; j++) { printf("%d ERROR\n", b[j]); } } return 0; } /*************************************************** User name: jk170704刘彤阳 Result: Accepted Take time: 4ms Take Memory: 192KB Submit time: 2018-01-21 21:49:23 ****************************************************/