STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)
1.FIFO队列
std::queue就是普通意思上的FIFO队列在STL中的模版。
1.1主要的方法有:
(1)T front():访问队列的对头元素,并不删除对头元素
(2)T back():访问队列的末尾元素,并不删除末尾元素
(3)void pop():删除对头元素。
(4)void push(T):元素入队
1.2代码实例
#include <iostream>
#include <queue>
using namespace std;
int main()
{
std::queue<int> myqueue;
myqueue.push(); //入队
myqueue.push();
myqueue.push(); cout<<"队列末尾元素:"<<myqueue.back()<<endl;
cout<<"队列元素出队顺序如下:";
while(!myqueue.empty()) //判空
{
cout<<myqueue.front()<<" "; //访问队列头元素
myqueue.pop(); //队列头元素出对
}
return ;
}
程序输出:
2.优先队列
std::priority_queue就是优先级队列在STL中的模版,在优先队列中,优先级高的元素先出队列,内部使用堆实现(大顶堆,同Top K问题)。
2.1 模版原型:priority_queue<T,Sequence,Compare>
T:存放容器的元素类型
Sequence:实现优先级队列的底层容器,默认是vector<T>
Compare:用于实现优先级的比较函数,默认是functional中的less<T>
2.2主要对方法有:
(1)T top():访问队列的对头元素,并不删除对头元素
(2)void pop():删除对头元素。
(3)void push(T):元素入队
2.3使用默认参数的优先队列实例
#include <iostream>
#include <queue>
int main()
{
std::priority_queue<int> mypq;
mypq.push(); //入队
mypq.push();
mypq.push();
mypq.push();
std::cout << "Popping out elements...";
while (!mypq.empty())
{
std::cout << ' ' << mypq.top(); //读取队列头元素
mypq.pop(); //对头元素出队列
}
std::cout << '\n';
return ;
}
程序输出:
2.4使用自定义的比较函数的优先队列实例
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,大的优先级高,优先输出。我们只要重写<操作符就可以啦(可以像C语言的qsort()一样,可以写比较复杂的比较函数)。
下面的实例中,重写<操作符,使得数字小的数,优先级大。
#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
struct Node
{
int f;
bool operator<(const Node& node)const
{
return f<node.f? false :true ; //小的数字,可以让它不小
}
};
class cmp
{
public:
bool operator()( const Node & n1, const Node & n2) const
{
return n1<n2; //Node类已经重写了<运算符
}
};
int main()
{
priority_queue< Node,vector<Node>,cmp > q;
Node n1,n2,n3,n4; n1.f = ; n2.f = ;
n3.f = ; n4.f = ; q.push(n1); q.push(n2);
q.push(n3); q.push(n4);
while(!q.empty())
{
cout<< q.top().f<<" ";
q.pop();
}
}
程序输出:
3.双端队列
双端队列就是一个两端都是结尾的队列。队列的每一端都可以插入数据项和移除数据项。deque是STL中双端队列模版。
3.1主要对方法有:
(1)void pop_front():从队列头部删除元素
(2)void pop_back():从队列删除元素
(3)void push_front(T):从队列头部插入元素
(4)void push_back(T):从队列尾部插入元素
(5)T front():读取队列头部元素
(6)T back(T):读取队列尾部元素
3.2代码实例
#include <iostream>
#include <deque> int main ()
{
std::deque<int> mydeque;
mydeque.push_back (); //队列尾部插入
mydeque.push_back ();
mydeque.push_back ();
mydeque.push_front(); //队列头部插入 std::cout << "Popping out the elements in mydeque:";
while (!mydeque.empty())
{
std::cout << ' ' << mydeque.front();
mydeque.pop_front(); //删除队列头部
}
std::cout << "\nThe final size of mydeque is " << int(mydeque.size()) << '\n';
return ;
}
程序输出:
STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)的更多相关文章
- 06.队列、python标准库中的双端队列、迷宫问题
class QueueUnderflow(ValueError): """队列为空""" pass class SQueue: def __ ...
- python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表
目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...
- HDU 4286 Data Handler --双端队列
题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...
- python中使用双端队列解决回文问题
双端队列:英文名字:deque (全名double-ended queue)是一种具有队列和栈性质的抽象数据类型. 双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行. 双端队列可以在 ...
- PHP双向队列,双端队列代码
<?php /** * User: jifei * Date: 2013-07-30 * Time: 23:12 */ /** * PHP实现双向队列,双端队列 * 双端队列(dequ ...
- ArrayDeque(JDK双端队列)源码深度剖析
ArrayDeque(JDK双端队列)源码深度剖析 前言 在本篇文章当中主要跟大家介绍JDK给我们提供的一种用数组实现的双端队列,在之前的文章LinkedList源码剖析当中我们已经介绍了一种双端队列 ...
- 2601 电路维修 (双端队列bfs\优先队列bfs(最短路))
描述 Ha'nyu是来自异世界的魔女,她在漫无目的地四处漂流的时候,遇到了善良的少女Rika,从而被收留在地球上.Rika的家里有一辆飞行车.有一天飞行车的电路板突然出现了故障,导致无法启动. 电路板 ...
- 【C++】STL常用容器总结之五:双端队列deque
6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...
- 队列(Queue)\双端队列(Deque)
队列(Queue)\双端队列(Deque) 队列(Queue) 双端队列(Deque) 算法应用 队列(Queue) 特点: 和栈不同,队列的最大特点是先进先出(FIFO),就好像按顺序排队一样.对于 ...
随机推荐
- linux config
1.自定义命令:.bashrc 文件添加自定义命令 2.完成后,命令:source . .bashrc 使配置的自定义命令生效,如果提示没有该命令的情况,用 . .bashrc (注意是2个“点 ...
- 洛谷——P1023 税收与补贴问题
P1023 税收与补贴问题 题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最 ...
- 【基本功】深入剖析Swift性能优化
简介 2014年,苹果公司在WWDC上发布Swift这一新的编程语言.经过几年的发展,Swift已经成为iOS开发语言的“中流砥柱”,Swift提供了非常灵活的高级别特性,例如协议.闭包.泛型等,并且 ...
- JDK源码分析(二)——LinkedList
目录 LinkedList LinkedList继承结构 LinkedList内部类Node LinkedList成员属性 LinkedList构造方法 重要方法 Deque方法的实现 遍历 总结 L ...
- Atcoder681 Typical DP Contest E.数 数位dp
写什么递归....非递归多好写 令$f[i][j]$表示前$i$位的和在模$d$意义下为$j$的方案数,然后转移即可 复杂度$O(10000 * 100 * 10)$ 注意非递归建议高位摆第$n$位. ...
- 【数论】Codeforces Round #483 (Div. 2) [Thanks, Botan Investments and Victor Shaburov!] C. Finite or not?
题意:给你一个分数,问你在b进制下能否化成有限小数. 条件:p/q假如已是既约分数,那么如果q的质因数分解集合是b的子集,就可以化成有限小数,否则不能. 参见代码:反复从q中除去b和q的公因子部分,并 ...
- Git 简易使用指南及补充
Git最简易的使用指南 助你开始使用 git 的简易指南,木有高深内容,;) 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹, ...
- 监控 Linux 系统的 7 个命令行工具
监控 Linux 系统的 7 个命令行工具: " 深入 关于Linux最棒的一件事之一是你能深入操作系统,来探索它是如何工作的,并寻找机会来微调性能或诊断问题.这里有一些基本的命令行工具,让 ...
- python开发_tkinter_获取文本框内容_给文本框添加键盘输入事件
在之前的blog中有提到python的tkinter中的菜单操作 python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 python开发_tkinter_窗口控件_自 ...
- hdoj 1002 A + B Problem II 高精度 java
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...