图片来源于王道机试课程
#include <queue>
#include <cstdio>
using namespace std;
struct Animal{
int num;
int seq;
};
int main() {
queue<Animal> catQueue;
queue<Animal> dogQueue;
int seq = 0;
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
int method,para;
scanf("%d%d", &method, ¶);
if (method == 1){
//入队 para是动物的编号
if (para > 0){
//处理狗
Animal dog;
dog.num = para;
dog.seq = seq;
++seq;
dogQueue.push(dog);
} else{
//处理猫
Animal cat;
cat.num = para;
cat.seq = seq;
++seq;
catQueue.push(cat);
}
} else{
//出队
if (para == 0){
// 不区分猫和狗
// 1 无猫无狗
if (dogQueue.empty() && catQueue.empty()){
continue;//跳过本次循环体的剩余代码,直接执行下一次循环
}
// 2 收养狗
// 2.a 狗非空 猫为空
// 2.b 狗非空 猫非空 队首狗的序列号小一点
else if (catQueue.empty() ||
!dogQueue.empty() && !catQueue.empty() && dogQueue.front().seq < catQueue.front().seq){
printf("%d ",dogQueue.front().num);
dogQueue.pop();
} else{
//收养猫
printf("%d ",catQueue.front().num);
catQueue.pop();
}
} else if (para == 1){
// 领养狗
if (dogQueue.empty()){
continue;
}
printf("%d ",dogQueue.front().num);
dogQueue.pop();
} else{
// 领养猫
if (catQueue.empty()){
continue;
}
printf("%d ",catQueue.front().num);
catQueue.pop();
}
}
}
printf("\n");
return 0;
}