STL中的队列
创始人
2024-05-08 03:16:58
0

STL中包括三种队列:queue、deque和priority_queue。

其中,priority_queue实际上不是队列,而是堆结构。下面主要介绍queue和deque的创建和使用方法。

queue

queue为STL的适配容器,具有队列的结构特性。其创建方法与stack类似。操作除了将top函数改为front函数,并添加获取队尾函数back外,其他与stack类似

#include
using namespace std;
typedef int datatype;
#include
#include
#includeint main()
{queuequ; //创建queue对象,底层容器为dequequeue>qu1; //创建queue对象,底层容器为vectorqueue>qu2; //创建queue对象,底层容器为listqu.push(3); qu.push(5); qu.push(2); //入队cout << qu.size() << endl; //队中元素个数cout << qu.back() << endl; while (!qu.empty()) { //判断队列是否为空cout << qu.front() << " "; //获取队头元素qu.pop(); //出队}cout << endl;
}

deque

deque为STL提供的标准容器之一,成为双端队列,为适配器容器stack和queue的默认底层容器。deque和vector非常类似,均属于线性的随机容器,且都是采用动态数组来存放元素。

所有vector对象的创建和初始化方法都适用于创建和初始化deque对象:

dequedq; //创建一个空的deque对象
dequedq2(12, 5); //创建一个含有12个元素的deque对象,元素的初始值为5
int a[] = { 1,4,7,2,5,8,3,6,9 }; 
dequedq4(a + 2, a + 6); //创建还有4个元素的deque对象,元素的初始值为a[2]~a[5]

对vector对象的操作大多数都适用于deque对象,除了与容量相关的函数(如capacity()、reserve()等)。另外,deque对象还有一些特有的操作,主要是可以对队头进行操作:

dq.push_front(7);
dq.pop_front();

其他操作与vector完全一样。

队列应用举例

        一般来说,只有具有先进先出特征的算法都可以利用队列实现。在计算机操作系统中经常会出现多个用户或任务同时请求同一资源的情形,如果按照先申请先处理的策略(如果任务有优先级,则要采用优先队列),则可以用队列来存放待处理的资源请求序列。例如,当在某一时间段多次向打印机提交打印请求时,由于一次只能打印一个文件,因此利用队列保存由用户提交的打印作业,实现先申请先打印。
        利用队列可以很好地实现异步处理数据传送和存储,例如,当频繁向数据库中插入数据时,可以将插人指令按照申请插入的时间顺序存放到队列中,然后依次执行插入指令。另外,可以将较慢的处理逻辑和有并发数量限制的处理逻辑,通过消息队列放在后台处理,如发送电子邮件等。
        后面许多算法的实现也是采用队列,如广度优先搜索、拓扑排序等。下面介绍队列的一些简单应用。


【例1】在周末舞会上,男士和女士在进入舞厅后分别按性别排成一队。一首舞曲为一轮,在每一轮开始时,依次将男队和女队处于队头的两人配成舞伴,并出队,直到其中一队已全部配对如果男女人数不同,则人数较多的那一队中未配对者继续排队等待下一轮。当一轮跳完后,参加这一轮跳舞的所有人按照原先的顺序排在男队或女队的后面。假设共进行n轮,编写模拟算法,输出每一轮的舞伴配对情况。
        例如,如果参加舞会的男士为{"张一","杨帆”,"李华",赵勇"},女士为{"李丽”,“孙茜”,”刘倩”},则前三轮配对情况如下:
第1轮的配对情況:(张一 李丽),(杨帆 孙茜),(李华 刘倩);
第2轮的配对情况:(赵勇 李丽),(张一 孙茜),(杨帆 刘倩)
第3轮的配对情况:(李华 李丽) (赵勇 孙茜) (张一 刘倩)

#include
using namespace std;
typedef int datatype;
#include
#include
#includevoid partnerMatching(vectorm, vectorf, int n)
{int i = 0, j = 0, msz = m.size(), fsz = f.size();queuemq, fq;for (int i = 0; i < msz; i++) mq.push(m[i]); //初始化男队队列for (int i = 0; i < fsz; i++) fq.push(f[i]); //初始化女队队列for (int i = 1; i <= n; i++) {cout << "第" << i << "轮的配对情况:" << endl;j = min(msz, fsz); //满足其中人数少的一队全部配对为一轮while (j--) {string tmp;tmp = mq.front(), mq.pop(), mq.push(tmp); //男队出队,出队后加入队尾cout << tmp << " ";tmp = fq.front(), fq.pop(), fq.push(tmp); //女队出队,出队后加入队尾cout << tmp << endl;}}
}int main()
{vectorm = { "张毅","杨帆","李华","赵勇" };vectorf = { "李丽","孙茜","刘倩" };partnerMatching(m, f, 7);
}

单调队列

单调队列是指队列元素严格单调的队列。如果队列的元素按从队头到队尾的顺序为严格单调递增,则称为递增队列;如果队列的元素按从队列到队尾的顺序为严格单调递减,则称为递减队列。

单调队列是对队列的入队和出队操作加了一些限制条件,以保证队列的单调性,且队头和队尾都可以进行出队操作,而入队操作只能在队尾,取元素只能在队头。

由于单调队列需要从队列的两端出队,因此通常用双端队列deque实现。

单调队列一般用于解决某个范围内的最小值或最大值问题,另一个典型应用是对一些动态规划进行优化。

【例1】利用单调队列求数组在固定长度区间的最大值。举例子:数组a={2,5,3,4,10,6,3,7,8},设置滑动窗口为3,求滑动窗口范围内的最大值,结果={5,5,10,10,10,7,8}。

#include
using namespace std;
typedef int datatype;
#include
#includevoid rangeMax(vectorve, int m) {dequedq;for (int i = 0; i < ve.size(); i++) {while (!dq.empty() && ve[dq.back()] < ve[i]) //去尾dq.pop_back();dq.push_back(i); //下标入队,控制滑动窗口的长度if (i >= m - 1) {if (!dq.empty() && i - dq.front() >= m) //掐头,大于滑动窗口范围,去除第一个dq.pop_front();cout << ve[dq.front()] << " "; //输出队头}}
}int main()
{vectorve = { 2,5,3,4,10,6,3,7,8 };rangeMax(ve, 3);
}

 

相关内容

热门资讯

谁能给我发几个好看的穿越文,女... 谁能给我发几个好看的穿越文,女主要聪明点的,还有请给我发下《蛇蝎皇后》这篇小说我有比较多的小说,但是...
网络语叫粉丝是什么意思? 网络语叫粉丝是什么意思?'粉丝’是英语‘Fans’(狂热、热爱之意,后引申为影迷、追星等意思)的音译...
你们希望柯南的最后大结局是新兰... 你们希望柯南的最后大结局是新兰永恒吗肯定滴啊,如果新兰都不永恒了谁还相信爱情、、、 上次预告还有五年...
出师表朗诵 出师表朗诵出师表的朗诵应该配上什么音乐,或者歌曲(最好是现代的),给点建议!新三国片头曲吧试试王宗贤...
《率土之滨》平民新手开局怎么玩... 《率土之滨》平民新手开局怎么玩?前期开荒核心是完美的利用每一点资源,把他变为你前期最有利的抢地武器!...
咒怨里面的白老妇[那个鬼 的扮... 咒怨里面的白老妇[那个鬼 的扮演者是谁?告诉我吧求求你们了 我要是不知道他是活人演的拿篮球的那个老婆...
体验当家的辛苦 体验当家的辛苦自己体会会有灵感的。什么事情还是自己做一下比较真实这样的作文就必须要自己去亲身体会,让...
(只要人物时间地点的正确就能开... (只要人物时间地点的正确就能开启尘封已久的记忆)能解释一下这个是什么含义是一个女的写给我的是表白吗大...
科学和迷信你们信哪个?不能解释... 科学和迷信你们信哪个?不能解释的东西事物算得上是迷信吗迷信我是不会相信的,如果对所谓的科学百分之百的...
请问延世大学韩语教程和标准韩国... 请问延世大学韩语教程和标准韩国语哪本更适合自学?哪本语法更详细,更易于学习。先谢谢啦。你好,标准韩国...
有谁曾经暗恋一个人,很久都没有... 有谁曾经暗恋一个人,很久都没有见到却还是很想念他想就想呗,随自己的意就可以了让她留在心里吧.我也曾暗...
昨天在车上看的碟子,好像是,一... 昨天在车上看的碟子,好像是,一个DJ现场,一个人边唱边喝酒,还互动问题,答完就喝。提问的歌曲有:洪湖...
魔兽世界小白任务和战场问题 魔兽世界小白任务和战场问题去魔兽数据库里找 多玩 嘟牛 这两个网站的 数据库很全 什么任务...
《公主回宫》什么时候开播? 《公主回宫》什么时候开播?已经开播了,祝你愉快.
到底大灰狼和小绵羊是一对,还是... 到底大灰狼和小绵羊是一对,还是和小白兔是一对很显然小绵羊和小白兔是一对
你觉着《他来了请闭眼》中霍建华... 你觉着《他来了请闭眼》中霍建华演技如何?《他来了请闭眼》中霍建华演技很好。霍建华的演技很好,能够表现...
九色神鹿故事? 九色神鹿故事?很久以前,在恒河边上有一只九种毛色的鹿,它那闪闪发光的鲜艳毛色和洁白如雪的美丽鹿角,以...
刘州成坚强的故事 刘州成坚强的故事就是男子汉一点的 刘小美的刘州成他是一个很坚强的人来的.. 一路走来他都是勇敢地走来...
书籍设计的内容简介 书籍设计的内容简介《书籍设计》立足于新世纪中国艺术教育的改革,将艺术理论与技能培训融会贯通,从内容选...
2024年山西中考初二考地理生... 2024年山西中考初二考地理生物吗不考。截止2022年6月1日山西中考除晋中和阳泉两个改革试点区域外...