开头声明
本文由署髫亲自撰写并非转载。
如果代码或文章内容有误,请大佬们及时指出。
部分内容是从网上复制的。
!!链接绝对安全无毒!!
点个赞呗~
什么是队列
在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;
}
在出队函数中说过如果队首的位置和队尾的位置相等,那么就代表队列为空,否则不为空。
代码实题
描述
输入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容器(队列)的函数
代码实题
描述
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模版中的队列,我们可以修改主函数的部分内容,实现其他程序。
我给大家挑了几道简单的小题,大家可以做一做:
都看到这儿了,就点个赞呗~
署髫只是个初中生,就点一个吗~