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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章