题目要求
已定义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!