C. DS队列_动物收容所

题目描述

有一家动物收容所只收容猫与狗,且严格遵守先进先出原则。在收养该收容所的动物时,收养人只能收养猫或狗,且收养的那一只动物必须是那种动物中剩下未被收养的最先进入收养所的那一只动物。换而言之,收养人不能自由挑选想收养的对象。

题目保证编号number为非负整数,且每次提供的编号比前一次的编号大。

实现AnimalShelf类:

1. void enqueue(int number, string type):收养所接收编号为number的动物,type为"cat"或"dog"。

2. void dequeueAny(int* number, string* type):收养人接受收养猫或狗,但是收养所给予的动物必须是剩下的动物中最先进入收养所的那一只。将动物编号与动物种类分别放置在number[0]和type[0]里。

3. int dequeueDog():收养人只接受收养狗,收养所给予的狗必须是所有剩下的狗之中最先进入收养所的那一只。

4. int dequeueCat():收养人只接收收养猫,规定同上。

输入

第一行输入t,表示有t个测试样例。

第二行起,首先输入n,表示会执行n个操作,接着输入n个操作。

如果输入的操作是字符串"enqueue",则该操作接下来还会输入一个非负整数number和一个字符串type,type为"cat"或"dog";

如果输入的是字符串"dequeueDog"、"dequeueCat"或"dequeueAny",则该操作不会输入其他内容。

以此类推,共输入t个测试样例。

3
5 enqueue 0 cat enqueue 1 cat dequeueCat dequeueDog dequeueAny
6 enqueue 0 cat enqueue 1 cat enqueue 2 dog dequeueDog dequeueCat dequeueAny
13 dequeueAny dequeueDog dequeueCat enqueue 20 cat dequeueAny enqueue 30 dog dequeueAny enqueue 50 cat enqueue 60 dog dequeueAny enqueue 70 cat dequeueAny dequeueAny

输出

每一行输出在执行"dequeueDog"、"dequeueCat"和"dequeueAny"操作后所获得的动物,输出格式是"[number type]"。

如果无法领养到对应的动物,则输出"[-1 none]"。

注意输出末尾的空格。

[0 cat] [-1 none] [1 cat] 
[2 dog] [0 cat] [1 cat] 
[-1 none] [-1 none] [-1 none] [20 cat] [30 dog] [50 cat] [60 dog] [70 cat] 

 

提示

0 <= number <= 1000

题目保证每次提供的编号比前一次的编号大。

#include<iostream>
#include <queue>
using namespace std;

class AnimalShelf
{   
public:
    queue<int> cat;
    queue<int> dog;
    AnimalShelf() {}
    void enqueue()//放入一只动物
    {
        int order;
        string type;

        cin >> order >> type;
        if (type == "cat")
            cat.push(order);
        else
            dog.push(order);
    }
    void dequeueAny()//输出任意的动物
    {
        if (cat.empty() && dog.empty())//都空输出-1
        {
            cout << "[-1 none] ";
            return;
        }
        if (cat.empty())//无小猫则输出小狗
        {
            cout << "[" << dog.front()<< " dog] ";
            dog.pop();
            return;
        }
        if (dog.empty())//无小狗输出小猫
        {
            cout << "[" << cat.front() << " cat] ";
            cat.pop();
            return;
        }
        if (cat.front() < dog.front())//都有则按编号输出
        {
            cout << "[" << cat.front() << " cat] ";
            cat.pop();
        }
        else
        {
            cout << "[" << dog.front() << " dog] ";
            dog.pop();
        }
    }
    int dequeueDog()//输出小狗
    {
        if (dog.empty())
        {
            cout << "[-1 none] ";
            return 0;
        }
        else
        {
            cout << "[" << dog.front() << " dog] ";
            dog.pop();
            return 0;
        }
    }
    int dequeueCat()//输出小猫
    {
        if (cat.empty())
        {
            cout << "[-1 none] ";
            return 0;
        }
        else
        {
            cout << "[" << cat.front() << " cat] ";
            cat.pop();
            return 0;
        }
    }
};

int main() 
{
    int t, n;    
    string judge;

    cin >> t;
    while (t--)
    {
        AnimalShelf a;//创建一个动物所
        cin >> n;
        while (n--)
        {
            cin >> judge;
            if (judge == "enqueue")
                a.enqueue();
            if (judge == "dequeueAny")
                a.dequeueAny();
            if (judge == "dequeueCat")
                a.dequeueCat();
            if (judge == "dequeueDog")
                a.dequeueDog();
        }
        cout << endl;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值