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

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