题目描述:
代码实现:
/*
* 猫狗收养问题
* 维护两个队列
*/
#include <queue>
#include <cstdio>
using namespace std;
struct Animal{
int num; //编号 区分猫狗
int seq; //收养当中出现的顺序
};
int main(){
//创建两个队列
queue<Animal> catQue; //Animal 和 int 用法一样
queue<Animal> dogQue;
int seq = 0; //每收养一个动物 序号+1
int n;
scanf("%d",&n);
for (int i = 0; i < n; ++i) { //n次输入
int method,para;
scanf("%d%d",&method,¶); //入养还是收养,以及其方式
if (method ==1){
//入养是入队操作; para是某类型动物的编号表示
if(para>0){
//处理狗
Animal dog; //定义一个狗
dog.num = para;
dog.seq = seq;
++seq;
dogQue.push(dog); //狗的编号和序列进入到我们的队列
}else{
//处理猫
Animal cat;
cat.num = para;
cat.seq = seq;
++seq;
catQue.push(cat);
}
}
else{
//领养是出队操作
if (para == 0){ //领养 不区分猫狗
// 无猫无狗
if (dogQue.empty() && catQue.empty()){
continue; //跳过本次循环
}
//狗非空 猫为空 ; 狗 猫非空 队首狗的序列号 更小一些
else if(catQue.empty() ||
!dogQue.empty() &&!catQue.empty() && dogQue.front().seq < catQue.front().seq){
//收养狗的情况
printf("%d ",dogQue.front().num);
dogQue.pop();
}
else{
//收养猫的情况
printf("%d ",catQue.front().num);
catQue.pop();
}
}
else if (para == 1){ //指定领养狗
if(dogQue.empty()){
continue;
}else{
printf("%d ",dogQue.front().num);
dogQue.pop();
}
}
else{ //领养猫
if(catQue.empty()){
continue;
}else{
printf("%d ",catQue.front().num);
catQue.pop();
}
}
}
}
printf("\n");
}