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);
}

 

相关内容

热门资讯

山东招考院回应小伙为救同学耽误... 近日,“小伙为救同学职教高考语文缺考”冲上热搜,引发关注。5月14日,山东省教育招生考试院发布消息:...
因存在安全隐患 福特公司召回约... 央视记者当地时间5月14日获悉,福特汽车公司宣布,由于存在可能导致车辆在行驶过程中丧失制动功能、增加...
“流动的博物馆”进校园传薪火 本报讯(记者 宁亚琴 摄影报道)当满载文物知识的流动展板进入校园,一场跨越时空的文化对话就此开启。5...
泽连斯基:基辅已准备好进行“任... 转自:财联社【泽连斯基:基辅已准备好进行“任何形式的谈判”以结束与俄罗斯的冲突】财联社5月15日电,...
公益金赋能伊春市青少年冰雪赛事 黑龙江省伊春市地处小兴安岭腹地,作为北方知名的森林生态旅游城市,冰雪旅游一直是“林都”伊春最亮眼的名...
“当时我还以为方向盘失控了” ... 平面示意图 “晚上经过这里变道,车身都要剧烈振动一下,好影响行车安全哦。”近日,有读者向重庆晨报反映...
“青春同行,公益筑梦”爱心传递... 与此同时,一场非凡的公益之旅也在同步进行。“青春同行,公益筑梦”活动,于5月6日至31日在28省市火...
阿尼玛卿黄河水源涵养地科学考察... 本报讯(记者 师晓琼)5月13日,由三江源生态保护基金会、三江源国家公园管理局、五矿国际信托有限公司...
抽签结果出炉 北京时间5月14日,2027年男篮世界杯预选赛抽签仪式在卡塔尔多哈举行,中国男篮最终被分在B组。和中...
欧洲三大股指收盘小幅下跌 德国... 转自:财联社【欧洲三大股指收盘小幅下跌 德国DAX指数跌0.47%】财联社5月15日电,欧洲三大股指...
36岁宋轶现身央视端午晚会录制... 5月14日晚,根据录制现场的路透信息,目前确定参与的艺人包括宋轶(白旗袍古典造型获赞)、刘宇(国风舞...
特朗普中东行 “绕不开”以色列 美国总统唐纳德·特朗普5月13日至16日访问沙特阿拉伯、卡塔尔和阿拉伯联合酋长国三国,此行将不会到访...
频繁的器材变革让国乒遭遇“多哈... 2025多哈世乒赛开幕进入倒计时,中国乒乓球队已经抵达多哈,提前进行适应性训练。澳门世界杯男单丢冠之...
这场家风主题活动上,近500岁... 转自:上观新闻奉贤区南桥镇吴塘村的“明代牡丹苑”内有一株距今近500年的古牡丹。据史料记载,明代书画...
评论丨如何把握美国通胀当前走势...   孙长忠(清华大学全球私募股权研究院研究员)  美国劳工部5月13日公布4月CPI通胀数据显示:4...
俄罗斯库尔斯克州发生交通事故 ... 当地时间5月14日,俄罗斯库尔斯克州州长发布消息称,该州一地发生了严重交通事故,客车与轿车相撞,已致...
美元预测:周四零售销售数据会将...   来源:汇通网  周三(5月14日)欧盘时段,美元指数(DXY)盘中跌至100.58,下跌0.40...
欧洲债市:意大利与德国国债利差...   意大利与德国国债利差一度跌破100个基点,为2021年9月以来首次出现,反映风险偏好改善。  意...
朝阳无限社区邻里节暖心启幕 转自:劳动午报 近日,朝阳区八里庄街道朝阳无限社区举办“爱满无限 睦邻同心 共筑美好”主题邻里节,通...
马来西亚18岁中国留学生绑架案... 5月13日,两名中国留学生在马来西亚伪造绑架,骗取父母500万元赎金,被警方逮捕。5月14日,曾协助...