当前位置: 首页 > article >正文

(三十三)队列(queue)

文章目录

  • 1. 队列(queue)
    • 1.1 定义
    • 1.2 函数
    • 1.3 习题
      • 1.3.1 例题(周末舞会)
  • 2. 双向队列(deque)
    • 2.1 定义
    • 2.2 函数
    • 2.3 题目
      • 2.3.1 例题(打BOSS)

1. 队列(queue)

队列也是一种特殊的数据类型,它遵守了先进先出(FIFO, First In First Out)原则

1.1 定义

形象点儿说,队列相当于学校的排队的食堂,先来排队的先得到饭,然后先走;后来排队的最后得到饭,最后走。

STL 专门提供了关于栈和队列的容器,还拓展了一个双向队列(deque)

导入栈(stack):#include <stack>
导入队列(queue):#include <queue>
导入双向队列(deque):#include <deque>
三个库均可使用 #include <bits/stdc++.h> 导入

1.2 函数

想要构造一个队列,可以使用queue<类型> 队列名称 这种方式构造,一般定义的名称:QTqQueue

  1. 名称.push(x):让x入队,也就是x排到队列后方
  2. 名称.pop():让队头出队,后面的代替队头
  3. 名称.front():返回队头数据
  4. 名称.size():返回队列长度
  5. 名称.empty():队列是否为空,空返回1,否则返回0
  6. 名称.clear():清空

遍历队列一般都是程序末尾的事

#include <iostream>
#include <queue>
using namespace std; 

int main () {
	queue<int> T; 
	...
	while(T.size()) {
		cout << T.front() << ' '; 
		T.pop(); 
	}
	return 0; 
}

1.3 习题

它和栈还有一种特殊的出法:DFS 与 BFS
这个后面会有关于它的文章

1.3.1 例题(周末舞会)

题目链接
题目描述
假设在周末舞会上, x x x 个男士和 y y y 个女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。舞曲总共播放 n n n 次。现要求写一个程序,模拟上述舞伴配对问题。

输入
第一行输入两个数 x x x y y y,表示两队的人数;
第二行输入一个数 n n n,表示舞曲的数目。

输出
输出 n n n 排,每排两个数,表示男士编号和女士编号

样例输入

4 6
7

样例输出

1 1
2 2
3 3
4 4
1 5
2 6
3 1

题解
仔细观察输出,你会发现规律:左边以 1 , 2 , . . . , x , 1 , 2 , . . . , x , . . . 1, 2, ..., x, 1, 2, ..., x, ... 1,2,...,x,1,2,...,x,... 的顺序输出,右边以 1 , 2 , y , . . . , 1 , 2 , . . . , y , . . . 1, 2, y, ..., 1, 2, ..., y, ... 1,2,y,...,1,2,...,y,... 的顺序输出

#include <iostream>
#include <queue>
using namespace std; 
int main() {
    int x, y, n; 
    cin >> x >> y >> n; 
    queue<int> M, F; //M:男士    F:女士
    for(int i=1; i<=x; i++) //初始化男士编号
        M.push(i); 
    for(int i=1; i<=y; i++) //初始化女士编号
        F.push(i); 
    for(int i=1; i<=n; i++) {
        M.push(M.front()); //跳完后男士排在队伍后面
        F.push(F.front()); //跳完后女士排在队伍后面
        cout << M.front() << ' ' << F.front() << endl; //输出
        M.pop(); 
        F.pop(); 
    }
    return 0; //结束程序
}

2. 双向队列(deque)

2.1 定义

这是 STL 独有的专属容器,它也有队头和队尾,但插入和删除可以同时进行。形象一点就是医院的“军人优先”。还是一个队列,普通人往后排,军人们有可以排在前面的特权。因此,队头可以插入删除,队尾也可以。

2.2 函数

使用deque<类型> 名称构造一个双向队列,一般名称TDeque

  1. 名称.push_front(x):向队头插入元素x
  2. 名称.push_back(x):向队尾插入元素x
  3. 名称.pop_front():队头出队
  4. 名称.pop_back():队尾出队
  5. 名称.front():返回队头元素
  6. 名称.back():返回队尾元素
  7. 名称.size():返回队列大小
  8. 名称.empty():队列是否为空,是返回1,否则返回0
  9. 名称.clear():清空

2.3 题目

双向队列只是stackqueue的整合,所以关于它的题目很少

2.3.1 例题(打BOSS)

这个复制不了,请点开 题目链接 查看

题解

#include <bits/stdc++.h>
using namespace std; 

int main () {
    int m, s, hp; 
    cin >> m >> s >> hp; 
    deque<int> T; 
    for(int i=1; i<=m; i++) {
        string o; 
        cin >> o; 
        if(o=="add") {
            int n; 
            cin >> n; 
            if(T.size()<s) {
                T.push_back(n); 
            }
        } else {
            if(!T.empty()) {
                if(T.front()>=T.back()) {
                    hp -= T.front(); 
                    T.pop_front(); 
                } else {
                    hp -= T.back(); 
                    T.pop_back(); 
                }
                if(hp<=0) {
                    cout << i; 
                    return 0; 
                }
            }
        }
    }
    cout << "-1"; 
    return 0; 
}

预览

  • 二十六:vector容器
  • 二十七:递推
  • 二十八:set容器
  • 二十九:map容器
  • 三十:二分查找
  • 三十一:前缀和与差分
  • 三十二:栈(stack)
  • 三十三:队列(queue)
  • 三十四:神奇的计算机
  • 三十五:链表
  • 三十六:树与遍历
  • 三十七:图与DFS、BFS
  • 三十八:array容器
  • 三十九:priority_queue容器

http://www.kler.cn/a/395581.html

相关文章:

  • 【C++】深入理解自定义 list 容器中的 list_iterator:迭代器实现详解
  • Molecular signatures database (MSigDB) 3.0
  • javaWeb小白项目--学生宿舍管理系统
  • 大模型在蓝鲸运维体系应用——蓝鲸运维开发智能助手
  • 【数据结构】AVL树
  • css中的变量使用
  • ES操作命令
  • 信息技术引领未来:大数据治理的实践与挑战
  • 使用视频提升应用在 App Store 中的推广效果
  • 【Java Web】Servlet
  • IntelliJ IDEA新建项目或导入未识别为maven解决
  • 视频流媒体播放器EasyPlayer.js RTSP播放器视频颜色变灰色/渲染发绿的原因分析
  • Spring Boot编程训练系统:开发与管理
  • C语言之MakeFile
  • SQL,力扣题目1126,查询活跃业务
  • 响应“一机两用”政策 落实政务外网安全
  • 【系统架构设计师】真题论文: 论企业集成平台的架构设计(包括解题思路和素材)
  • uniapp小程序分享使用canvas自定义绘制 vue3
  • 【开源免费】基于SpringBoot+Vue.JS高校学科竞赛平台(JAVA毕业设计)
  • 【MYSQL】数据库三大范式是什么?【最简单理解】
  • 多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码
  • ‌MySQL 5.7和8.0版本在多个方面存在显著区别,主要包括性能优化、新特性引入以及安全性提升
  • 2:Vue.js 父子组件通信:让你的组件“说话”
  • git命令提交项目
  • 适用比亚迪汽车生产线的RFID高频读写器
  • 为什么 Vue3 封装 Table 组件丢失 expose 方法呢?