STL之队列 笔记
STL之队列
参考文档
1|0☀️Queue☀️
Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。
1|1Queue没有迭代器
Queue所有元素的进出都必须符合”先进先出”的条件,只有queue的顶端元素,才有机会被外界取用。Queue不提供遍历功能,也不提供迭代器。
1|2Queue的构造函数
queue<T> queT;//queue采用模板类实现,queue对象的默认构造形式:
queue(const queue &que);//拷贝构造函数
1|3引入include
需要引入queue的STL库
#include <queue>
1|4基础操作
1、大小操作
size() //长度
length() //等于size()
empty() //判断是否空,返回布尔值
2、存取操作
front() //队首
back() //队尾
bush() //插入进第一个元素
pop() //弹出第一个元素
1|5练练手?👍
用刚才的几个小知识练一练
#include <iostream>
#include <queue>
using namespace std;
int main()
{
queue <int> que;
cout << boolalpha << que.empty() << endl;
que.push(100);
cout << que.front() << endl;
que.push(200);
cout << que.front() << endl;
cout << que.back() << endl;
que.push(300);
que.push(400);
//遍历队列
cout << "------" << endl;
while(!que.empty())
{
cout << que.front() << endl;
que.pop();
}
return 0;
}
解释:
1、boolalpha
是把布尔值变成true或者false,能直接显示,比如false,直接输出为0,但是加上就是输出false
2、front输出队首
3、back输出队尾
4、while只要que不为空就输出队首然后弹出队首,新的队首就变成了下一个
运行结果:
true
100
100
200
------
100
200
300
400
☁️其实,queue没有迭代器之后,它的可用方法也就上面这么点😸
2|0队列经典题目
👏讲了这么多,该练练题了👏
2|11、📚判断回文字符串-简单
就是看一个字符串是不是回文,例如abc不是,但aba就是
定义:正着念和反着念都一样
用到:queue和string
string也是STL的一种
简单到要命
自己想想就得了,就是练习基础语法
2|22、📚取牌游戏-简单
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,n,k,p,i;//k为纸牌数,n为人数,m为好牌数,p为移到最后的纸牌数
cin>>n>>k>>p;
queue<int>q;
int a[10005];
for(i=1;i<=k;i++)q.push(i);
i=1;
int ans=0;
while(!q.empty())
{
if(i%n==0){a[ans]=q.front();ans++;} q.pop();
i++;
for(int j=0;j<p;j++)
{
q.push(q.front());
q.pop();
}
}
sort(a,a+ans);
for(int j=0;j<ans;j++)cout<<a[j]<<endl;
return 0;
}
2|33、📚经典约瑟夫环-中等
#include <bits/stdc++.h>
using namespace std;
int main()//用队列做这个环真是太简单了,以前啥都没学的时候觉得真的难
{
int n,m;
cin>>n>>m;
queue<int>q;
for(int i=1;i<=n;i++)q.push(i);
int j=1;
while(q.size()!=1)//不是!q.empty()
{
if(j%m==0)q.pop();
else
{
q.push(q.front());
q.pop();
}
j++;
}
cout<<q.front();
return 0;
}
2|44、📚酒桌游戏-中等
#include <bits/stdc++.h>
using namespace std;
struct node
{
int num;
string name;
}p[1001];
int main()
{
int n,m,t;
cin>>n>>m>>t;
queue<node>q;
for(int i=1;i<=n;i++)
{
cin>>p[i].name;
p[i].num=i;
}
for(int i=1;i<=n;i++)q.push(p[i]);//这里应该从1起push
for(int j=0;j<m-1;j++)
{
q.push(q.front());
q.pop();
}
for(int j=t;q.size()!=1;j++)
{
if(j%7==0||j%10==7)q.pop();
else
{
q.push(q.front());
q.pop();
}
}
printf("%s\n",q.front().name.c_str());
return 0;
}
2|55、洛谷P2058 海港-中等
https://www.luogu.com.cn/problem/P2058
今天洛谷打不开了😓
#include <bits/stdc++.h>
using namespace std;
int a[300010],n,n1,x,t1,cnt;
struct sa
{
int t;//time
int c;//country
};
int main()
{
queue<sa>q;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&t1,&n1);
for(int i=0;i<n1;i++)
{
scanf("%d",&x);
q.push({t1,x});
if(a[x]==0)cnt++;
a[x]++;
}
while(t1-q.front().t>=86400&&!q.empty())//!q.empty()很重要
{
a[q.front().c]--;
if(a[q.front().c]==0)cnt--;
q.pop();
}
printf("%d\n",cnt);
}
return 0;
}
2|66、更多题目
更多题目LeetCode见!
https://www.leetcode-cn.com/
参考:
https://blog.csdn.net/qq_42322103/article/details/99685797
https://blog.csdn.net/zhoucheng_123/article/details/103973827
__EOF__
作 者:Aeterna
出 处:https://www.cnblogs.com/coding365/p/12872207.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步