猫狗队列

本文介绍了一种特殊的队列结构——猫狗队列,该队列能够接收并管理猫和狗的实例,提供多种操作如添加、弹出特定类型动物、检查队列状态等。通过使用两个队列分别存储猫和狗,实现了高效的数据管理和访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求

已定义Pet、Dog、Cat类

class Pet
{
private:
    string type;

public:
    Pet() {}
    Pet(string type)
    {
        this->type = type;
    }
    string getType()
    {
        return type;
    }
};

class Cat : public Pet
{
public:
    Cat() : Pet("cat") {}
};

class Dog : public Pet
{
public:
    Dog() : Pet("dog") {}
};

需要实现一种猫狗队列的结构,要求如下:
(1)用户可以调用add方法将cat类或者dog类的实例放入队列中;
(2)用户可以调用pollAll方法,将队列中所有的实例按照队列的先后顺序依次弹出;
(3)用户可以调用pollDog方法,将队列中dog类的实例按照队列的先后顺序依次弹出;
(4)用户可以调用pollCat方法,将队列中cat类的实例按照队列的先后顺序依次弹出;
(5)用户可以调用isEmpty方法,检查队列中是否还有dog和cat的实例;
(6)用户可以调用isDogEmpty方法,检查队列中是否还有do的实例;
(7)用户可以调用isCatEmpty方法,检查队列中是否还有cat的实例。

基本思路

       由于Pet、Dog、Cat类都已经定义好,所以最好是不要修改原本已经写好的类,否则容易在合作过程中产生问题。因此这里写另外一个函数对已完成的类进行包装,给每个猫猫狗狗带上一个标签值,用两个队列分别存储猫狗方便pollDog和pollCat,由于有标签因此pollAll也比较简单。

代码实现

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

class Pet
{
private:
    string type;

public:
    Pet() {}
    Pet(string type)
    {
        this->type = type;
    }
    string getType()
    {
        return type;
    }
};

class Cat : public Pet
{
public:
    Cat() : Pet("cat") {}
};

class Dog : public Pet
{
public:
    Dog() : Pet("dog") {}
};

class PetEnterQueue
{
private:
    Pet pet;
    int count;

public:
    PetEnterQueue(Pet pet, int count)
    {
        this->pet = pet;
        this->count = count;
    }

    Pet getPet()
    {
        return pet;
    }

    int getCount()
    {
        return count;
    }
};

class CatDogQueue
{
private:
    queue<PetEnterQueue> CatQueue;
    queue<PetEnterQueue> DogQueue;
    int count;

public:
    CatDogQueue()
    {
        count = 0;
    }

    void add(Pet pet)
    {
        count++;
        PetEnterQueue p(pet.getType(), count);
        if (pet.getType() == "cat")
        {
            CatQueue.push(p);
        }
        else if (pet.getType() == "dog")
        {
            DogQueue.push(p);
        }
        else
        {
            cout << "该动物既不是猫也不是狗,添加失败" << endl;
            return;
        }
    }

    Pet pollAll()
    {
        if (isEmpty())
        {
            throw runtime_error("已经没有小猫小狗了");
        }
        else
        {
            if (!isCatEmpty() && !isDogEmpty()) //两个队列均不为空
            {
                if (CatQueue.front().getCount() < DogQueue.front().getCount())
                {
                    Pet p = CatQueue.front().getPet();
                    CatQueue.pop();
                    return p;
                }
                else
                {
                    Pet p = DogQueue.front().getPet();
                    DogQueue.pop();
                    return p;
                }
            }
            else if (isCatEmpty()) //猫猫队列已空
            {
                Pet p = DogQueue.front().getPet();
                DogQueue.pop();
                return p;
            }
            else //狗狗队列已空
            {
                Pet p = CatQueue.front().getPet();
                CatQueue.pop();
                return p;
            }
        }
    }

    Cat pollCat()
    {
        if (isCatEmpty())
        {
            throw runtime_error("已经没有猫猫了");
        }
        else
        {
            Pet p = CatQueue.front().getPet();
            Cat c;
            Pet *p2 = &c;
            p2 = &p;
            CatQueue.pop();
            return c;
        }
    }

    Dog pollDog()
    {
        if (isDogEmpty())
        {
            throw runtime_error("已经没有狗狗了");
        }
        else
        {
            Pet p = DogQueue.front().getPet();
            Dog d;
            Pet *p2 = &d;
            p2 = &p;
            DogQueue.pop();
            return d;
        }
    }

    bool isEmpty()
    {
        return CatQueue.empty() && DogQueue.empty();
    }

    bool isCatEmpty()
    {
        return CatQueue.empty();
    }

    bool isDogEmpty()
    {
        return DogQueue.empty();
    }
};

int main()
{

    CatDogQueue cdq;
    cdq.add(Pet("pig"));
    if (cdq.isEmpty())
        cout << "The total queue is empty!" << endl;
    else
        cout << "The total queue is not empty!" << endl;

    cdq.add(Dog());
    if (cdq.isDogEmpty())
        cout << "Dog queue is empty!" << endl;
    else
        cout << "Dog queue is not empty!" << endl;

    if (cdq.isCatEmpty())
        cout << "Cat queue is empty!" << endl;
    else
        cout << "Cat queue is not empty!" << endl;

    for (int i = 0; i < 4; i++)
    {
        cdq.add(Cat());
        cdq.add(Dog());
    }

    for (int i = 0; i < 4; i++)
    {
        cout << "popDog:" << cdq.pollDog().getType() << endl;
    }

    for (int i = 0; i < 2; i++)
    {
        cout << "popCat:" << cdq.pollCat().getType() << endl;
    }

    for (int i = 0; i < 3; i++)
    {
        cout << "popAll:" << cdq.pollAll().getType() << endl;
    }

    if (cdq.isEmpty())
        cout << "The total queue is empty!" << endl;
    return 0;
}

输出结果:

该动物既不是猫也不是狗,添加失败
The total queue is empty!
Dog queue is not empty!
Cat queue is empty!
popDog:dog
popDog:dog
popDog:dog
popDog:dog
popCat:cat
popCat:cat
popAll:cat
popAll:cat
popAll:dog
The total queue is empty!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值