队列--STL模版中的queue|c++基础--详细讲解

开头声明

本文由署髫亲自撰写并非转载

如果代码或文章内容有误,请大佬们及时指出。

部分内容是从网上复制的。

!!链接绝对安全无毒!!

点个呗~

什么是队列

在C++中,队列是一种线性数据结构,遵循先进先出(FIFO)原则。C++ STL(标准模板库)提供了queue模板实现队列。

我用一个图片来解释一下

假设我们来银行的柜台来办理业务,你的前面有3个人,我们肯定不能插队到前面去 当我们办理完业务,准备回去时,我们要出去,我们也不能从进来的入口回去,而是从出口出去。我们发现我们来之前就有4个人了,此时5号已经办完业务回去了,4号正在办理业务,我们不难发现队列的顺序是先进先出、后进后出。看过我写的栈--STL模版中的stack|c++基础--详细讲解一定会发现队列的的顺序和栈的顺序相反。

入队的顺序就是:

5 4 3 2 1

出队的顺序就是:

5 4 3 2 1

可以看到入队的顺序和出队的顺序一模一样。

代码实现1

我们可以通过数组来模拟队列,实现队列的功能。


创建一个队列

int a[1001];
int rear=0,front=0;//rear:入队元素位置  front:出队元素位置

a数组是用来模拟队列用的,rear和front分别是入队元素位置和出队元素位置。

入队函数

void push(int x){
	if(x<=1000){
		a[rear]=x;
		rear++;
	}
}

和栈的入栈方式很像,同样是将要入队的元素判断有没有超限,再将队列的输入的数入队,最后入队的下标自增。

出队函数

void pop(){
	if(front != rear){
		front++;
	}
}

如果入队的数量和出对的数量相等,那么表示这个队列空了,就不能再出队了,反之出队元素的位置自增。

获取队首

int getfront(){
	return a[front];
}

获取队首只要拿取队列的当前队首位就可以了。

判断队列是否为空

bool empty(){
    if(rear==front){
        return 1;
    }
    return 0;
}

在出队函数中说过如果队首的位置和队尾的位置相等,那么就代表队列为空,否则不为空。

代码实题

4144 队列的操作--[简单]

 描述

输入5个整数,将这5个整数进行入队,接下来做三次出队操作,按照出队顺序输出出队元素,以上操作完成后输出此时的队首元素。

输入描述

输入5个整数,用空格隔开。

输出描述

输出2行,第1行输出出队元素,按照出队顺序输出,用空格隔开。
第2行输出完成出队操作后的队首元素。

#include<bits/stdc++.h>
using namespace std;
int a[1001];
int rear=0,front=0;//rear:入队元素位置  front:出队元素位置
void push(int x){
	if(x<=1000){
		a[rear]=x;
		rear++;
	}
}
int getfront(){
	return a[front];
}
void pop(){
	if(front != rear){
		front++;
	}
}
int main(){
	int num;
	for(int i=0;i<5;i++){
		cin>>num;
		push(num);
	}
	for(int i=0;i<3;i++){
		cout<<getfront()<<" ";
		pop();
	}
	cout<<endl<<getfront();
	return 0;
}

变量定义

int a[1001],top=0;

a数组是用来模拟队列用的,rear和front分别是入队元素位置和出队元素位置。

主函数

int num;
for(int i=0;i<5;i++){
	cin>>num;
	push(num);
}

用for循环输入5个数(题目要求),再依次入队。

for(int i=0;i<3;i++){
	cout<<getfront()<<" ";
	pop();
}
cout<<endl<<getfront();

按照题意我们要先利用for循环输出前三位,再换行输出队首。

代码实现2

我们可以通过STL模版创建队列,实现队列的功能。

STL模版queue容器(队列)的函数

代码实题

5368 约瑟夫问题--[简单+]

描述

n个人围成一圈,从第一个人开始报数,数到m的人出圈;再由下一个人开始报数,数到m的人出圈;…输出依次出圈人的编号。

输入描述

输入n和m的值。(2 ≤ n,m ≤ 1000)

输出描述

输出一行,依次出圈人的编号。

#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 num=1;
    int len=n;
    for(int i=0;i<len;i++){
        if(num%m==0){
            cout<<q.front()<<" ";
            q.pop();
        }else{
            q.push(q.front());
            q.pop();
            len++;
        }
        num++;
    }
	return 0;
}

 主函数

int n,m;
cin>>n>>m;
queue<int>q;
for(int i=1;i<=n;i++){
    q.push(i);
}
int num=1;
int len=n;

先输入有几个人以及报到几的人出圈,再将所有人的编号入队。num是用来记录报数的,len是控制循环长度的。

for(int i=0;i<len;i++){
    if(num%m==0){
        cout<<q.front()<<" ";
        q.pop();
    }else{
        q.push(q.front());
        q.pop();
        len++;
    }
    num++;
}

先写一个for循环就是要遍历整个队列,拿出队列的每一位看他报数报的是几,如果是m那么就输出后出队,否则放到队列的末尾。

视角拓展

基于STL模版中的队列,我们可以修改主函数的部分内容,实现其他程序。

我给大家挑了几道简单的小题,大家可以做一做:

1455 折绳子--[简单+]

2926 密室逃脱--[中等-]

2927 Blah数集--[简单+]

都看到这儿了,就点个赞呗~

署髫只是个初中生,就点一个吗~

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值