双向队列

Posted 王陸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双向队列相关的知识,希望对你有一定的参考价值。

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
ROUT
ROUT
ROUT
LIN 3
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 }

 

以上是关于双向队列的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的双向队列

deque(双向队列)基本用法

bzoj2151种树(堆/优先队列+双向链表)

如何初始化片段中的绑定属性以使双向数据绑定工作

Java 集合深入理解 :LinkedList链表源码研究,及双向队列如何实现

deque双向队列