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

 

你可能感兴趣的:(队列)