天天看點

雙向隊列

Description

想想雙向連結清單……雙向隊列的定義差不多,也就是說一個隊列的隊尾同時也是隊首;兩頭都可以做出隊,入隊的操作。

現在給你一系列的操作,請輸出最後隊列的狀态;

指令格式:

LIN X X表示一個整數,指令代表左邊進隊操作;

RIN X 表示右邊進隊操作;

ROUT

LOUT 表示出隊操作;

Input

第一行包含一個整數M(M<=10000),表示有M個操作;

以下M行每行包含一條指令;

指令可能不合法,對于不合法的指令,請在輸出中處理;

Output

輸出的第一行包含隊列進行了M次操作後的狀态,從左往右輸出,每兩個之間用空格隔開;

以下若幹行處理不合法的指令(如果存在);

對于不合法的指令,請輸出一行X ERROR

其中X表示是第幾條指令;

Sample Input

8

LIN 5

RIN 6

LIN 3

LOUT

Sample Output

3

7 ERROR

1 #include<stdio.h>
 2 #include<deque>
 3 #include<string.h>
 4 using namespace std;
 5 int main()
 6 {
 7     deque<int>q;
 8     int t,i,j,k[100],count,a;
 9     char x[20];
10     scanf("%d",&t);
11     count=0;
12     j=0;
13     while(t--)
14     {
15         scanf("%s",x);
16         if(strcmp(x,"LIN")==0)
17         {
18             scanf("%d",&a);
19             q.push_front(a);
20             count++;
21         }
22         if(strcmp("RIN",x)==0)
23         {
24             scanf("%d",&a);
25             q.push_back(a);
26             count++;
27         }
28         if(strcmp("LOUT",x)==0)
29         {
30             count++;
31             if(q.size()==0)
32                 k[j++]=count;
33             else
34             {
35                 q.pop_front();
36             }
37         }
38         if(strcmp("ROUT",x)==0)
39         {
40            count++;
41             if(q.size()==0)
42                 k[j++]=count;
43             else
44             {
45                 q.pop_back();
46             }
47         }
48     }
49     for(i=0;i<q.size();i++)
50     {
51         a=q.front();
52         printf("%d ",a);
53         q.pop_front();
54         q.push_back(a);
55     }
56     printf("\n");
57     for(i=0;i<j;i++)
58     {
59         printf("%d ERROR\n",k[i]);
60     }
61     return 0;
62 }