文章目录
- 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<类型> 队列名称 这种方式构造,一般定义的名称:Q,T,q,Queue等
- 名称.push(x):让x入队,也就是x排到队列后方
- 名称.pop():让队头出队,后面的代替队头
- 名称.front():返回队头数据
- 名称.size():返回队列长度
- 名称.empty():队列是否为空,空返回1,否则返回0
- 名称.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<类型> 名称构造一个双向队列,一般名称T,Deque等
- 名称.push_front(x):向队头插入元素x
- 名称.push_back(x):向队尾插入元素x
- 名称.pop_front():队头出队
- 名称.pop_back():队尾出队
- 名称.front():返回队头元素
- 名称.back():返回队尾元素
- 名称.size():返回队列大小
- 名称.empty():队列是否为空,是返回1,否则返回0
- 名称.clear():清空
2.3 题目
双向队列只是stack和queue的整合,所以关于它的题目很少
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容器
 …







![[每周一更]-(第123期):模拟面试|消息队列面试思路解析](https://i-blog.csdnimg.cn/direct/effcf975bd5f4dd187d0412a395c3655.jpeg#pic_center)






![[代码+论文+讲解]2024数维杯A题:飞机激光测速中的频率估计问题](https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83A)




