赞
踩
参考:https://blog.csdn.net/dengjin20104042056/article/details/54143585
双向队列,顾名思义就是队列二边都可以操作的队列。
双向队列和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样)。双向都可以进行相应的操作。
Constructors | 创建一个新双向队列 |
---|---|
Operators | 比较和赋值双向队列 |
assign() | 设置双向队列的值 |
at() | 返回指定的元素 |
back() | 返回最后一个元素 |
begin() | 返回指向第一个元素的迭代器 |
clear() | 删除所有元素 |
empty() | 返回真如果双向队列为空 |
end() | 返回指向尾部的迭代器 |
erase() | 删除一个元素 |
front() | 返回第一个元素 |
get_allocator() | 返回双向队列的配置器 |
insert() | 插入一个元素到双向队列中 |
max_size() | 返回双向队列能容纳的最大元素个数 |
pop_back() | 删除尾部的元素 |
pop_front() | 删除头部的元素 |
push_back() | 在尾部加入一个元素 |
push_front() | 在头部加入一个元素 |
rbegin() | 返回指向尾部的逆向迭代器 |
rend() | 返回指向头部的逆向迭代器 |
resize() | 改变双向队列的大小 |
size() | 返回双向队列中元素的个数 |
swap() | 和另一个双向队列交换元素 |
举个栗子:
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
AC代码:
#include <cstdio> #include <cstring> #include <queue> #include <deque> #include <algorithm> using namespace std; #define MAX 10010 int main() { deque<int>q; //创建双向队列 while(!q.empty())//清空双向队列 q.pop_front(); int n,a,i,m[MAX]= {0}; scanf("%d",&n); for(i=1; i<=n; i++) { char s[10]; scanf(" %s",s); if(!strcmp(s,"LIN")) { scanf("%d",&a); q.push_front(a); //在队列头(左边)存入数据 } else if(!strcmp(s,"RIN")) { scanf("%d",&a); q.push_back(a);//在队列尾(右边)存入数据 } else if(!strcmp(s,"LOUT")) { if(!q.empty()) q.pop_front(); //如果队列非空删除队列头(最左边)的数据 else m[i]++; } else if(!strcmp(s,"ROUT")) { if(q.empty()) m[i]++; else q.pop_back(); } } printf("%d",q.front()); q.pop_front(); while(!q.empty()) { printf(" %d",q.front());//输出队列中的数据 q.pop_front(); } printf("\n"); for(i=1; i<=n; i++) if(m[i]) printf("%d ERROR\n",i); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。