前言:
上一期说了数据结构栈
这一期我们跟着一道题来看一下队列
这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
问题描述:
描述
假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲只能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。
输入描述
第1行两个正整数,表示男士人数m和女士人数n,1≤m,n≤1000;
第2行一个正整数,表示舞曲的数目k,k≤1000。
输出描述
共k行,每行两个数,之间用一个空格隔开,表示配对舞伴的序号,男士在前,女士在后。
用例输入 1
2 4 6
用例输出 1
1 1 2 2 1 3 2 4 1 1 2 2
问题解析:
看了就知道特别水
思路
直接两个队列
一个表示男,一个表示女
然后分别入队和出队
就可以了
队列的简介:
队列 queue<>
1、队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:
(1)队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构;
(2)在队尾添加元素,在队头删除元素。
2、队列的相关概念:
(1)队头与队尾: 允许元素插入的一端称为队尾,允许元素删除的一端称为队头;
(2)入队:队列的插入操作;
(3)出队:队列的删除操作。
3、队列的操作:
(1)入队: 通常命名为push()
(2)出队: 通常命名为pop()
(3)求队列中元素个数
(4)判断队列是否为空
(5)获取队首元素
队列的函数
q.empty(); | 如果队列为空返回true,否则返回false |
q.size(); | 返回队列中元素的个数 |
q.pop(); | 删除队列首元素但不返回其值 |
q.front(); | 返回队首元素的值,但不删除该元素 |
q.push(); | 在队尾压入新元素 |
q.back(); | 返回队列尾元素的值,但不删除该元素 |
queue队列:相关资料
题目代码:
先写好变量如题
两个队列
int n,i,m,k;//人数 几轮舞蹈
queue<int> x,q;//分别表是男和女的队伍
接下来是输入和编号部分
cin>>n>>m>>k;//读入人数
for(i=1;i<=n;i++) x.push(i);//给每个男舞伴编号
for(i=1;i<=m;i++) q.push(i);//给每个女舞伴编号
写完读入可以直接输出了
while(k--)//循环跳舞轮数
{
cout<<x.front()<<" "<<q.front()<<endl;//输出当前跳舞者
x.push(x.front());//已经跳完的男舞伴
q.push(q.front());//已经跳完的女舞伴
x.pop();//已经跳完的男舞伴站到队尾
q.pop();//已经跳完的女舞伴站到队尾
}
完整代码:
#include<bits/stdc++.h>
using namespace std;
int n,i,m,k;//人数 几轮舞蹈
queue<int> x,q;//分别表是男和女的队伍
int main()
{
cin>>n>>m>>k;//读入人数
for(i=1;i<=n;i++) x.push(i);//给每个男舞伴编号
for(i=1;i<=m;i++) q.push(i);//给每个女舞伴编号
while(k--)//循环跳舞轮数
{
cout<<x.front()<<" "<<q.front()<<endl;//输出当前跳舞者
x.push(x.front());//已经跳完的男舞伴
q.push(q.front());//已经跳完的女舞伴
x.pop();//已经跳完的男舞伴站到队尾
q.pop();//已经跳完的女舞伴站到队尾
}
return 0;
}
题目测评:
样例通过