STL之隊列
參考文檔
☀️Queue☀️
Queue是一種先進先出(First In First Out,FIFO)的數據結構,它有兩個出口,queue容器允許從一端新增元素,從另一端移除元素。
Queue沒有迭代器
Queue所有元素的進出都必須符合”先進先出”的條件,只有queue的頂端元素,纔有機會被外界取用。Queue不提供遍歷功能,也不提供迭代器。
Queue的構造函數
queue<T> queT;//queue採用模板類實現,queue對象的默認構造形式:
queue(const queue &que);//拷貝構造函數
引入include
需要引入queue的STL庫
#include <queue>
基礎操作
1、大小操作
size() //長度
length() //等於size()
empty() //判斷是否空,返回布爾值
2、存取操作
front() //隊首
back() //隊尾
bush() //插入進第一個元素
pop() //彈出第一個元素
練練手?👍
用剛纔的幾個小知識練一練
#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沒有迭代器之後,它的可用方法也就上面這麼點😸
隊列經典題目
👏講了這麼多,該練練題了👏
1、📚判斷迴文字符串-簡單
就是看一個字符串是不是迴文,例如abc不是,但aba就是
定義:正着念和反着念都一樣
用到:queue和string
string也是STL的一種
簡單到要命
自己想想就得了,就是練習基礎語法
2、📚取牌遊戲-簡單
還是不怎麼難,但是給出代碼參考
#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;
}
3、📚經典約瑟夫環-中等
STL就是好用👍比循環的數組好用
#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;
}
4、📚酒桌遊戲-中等
☁️同樣是約瑟夫問題,但是加上結構體
#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;
}
5、洛谷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;
}
6、更多題目
更多題目LeetCode見!
https://www.leetcode-cn.com/
參考:
https://blog.csdn.net/qq_42322103/article/details/99685797
https://blog.csdn.net/zhoucheng_123/article/details/103973827