双向队列
Time Limit: 1000MS Memory limit: 65536K
题目描述
想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首;两头都可以做出队,入队的操作。
现在给你一系列的操作,请输出最后队列的状态;
命令格式:
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 int main()
5 {
6 int f[100000];
7 int i,j;
8 int n;
9 int sum=0,s=0;
10 int gh[100000]={-1};
11 scanf("%d",&n);
12 for(j=1;j<=n;j++)
13 {
14 char g[20];
15
16 scanf("%s",g);
17 if(strcmp(g,"LIN")==0)
18 {
19 int x;
20 scanf("%d",&x);
21 if(sum==0)
22 f[sum]=x;
23 else
24 {
25 for(i=sum;i>=1;i--)
26 f[i]=f[i-1];
27 f[0]=x;
28 }
29 sum++;
30 }
31 if(strcmp(g,"RIN")==0)
32 {
33 int x;
34 scanf("%d",&x);
35 f[sum]=x;
36 sum++;
37 }
38 if(strcmp(g,"LOUT")==0)
39 {
40 if(sum==1)sum=0;
41 else if(sum==0)
42 {
43 gh[s]=j;
44 s++;
45 }
46 else
47 {
48 for(i=0;i<=sum-2;i++)
49 f[i]=f[i+1];
50 sum=sum-1;
51 }
52 }
53 if(strcmp(g,"ROUT")==0)
54 {
55 if(sum==0)
56 {
57 gh[s]=j;
58 s++;
59 }
60 else sum=sum-1;
61 }
62 }
63 for(i=0;i<=sum-1;i++)
64 if(i==sum-1)printf("%d
",f[i]);
65 else printf("%d ",f[i]);
66 for(i=0;i<=s-1;i++)
67 if(gh[i]!=-1)printf("%d ERROR
",gh[i]);
68 return 0;
69 }