SDUT1466双向队列

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 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3168697.html