实现猫狗队列:
(1)push方法可以将cat类或dog类的实例加入队列
(2)popAll方法可以将队列中的实例按照进队顺序出队
(3)popDog方法、popCat方法将队列中Dog类的实例、Cat类的实例按照入队顺序分别出队
宠物、狗和猫的类如下:
class Pet
{
public:
//Pet() {}
Pet(string type) {
this->type = type;
}
string getPetType() {
return this->type;
}
private:
string type;
};
class Dog : public Pet {
public:
Dog() :Pet("dog") {}
};
class Cat : public Pet {
public:
Cat() :Pet("cat") {}
};
解决方案:
用一个Pet队列实现感觉可以,但是出队操作分猫狗就不方面了。因此使用两个队列——狗队列和猫队列,为了按照顺序出队,还需要添加时间戳。
具体实现如下,注意C++下得使用指针、父类转子类的方法。
class PetEnterQueue {
public:
PetEnterQueue(Pet* pet, long count) {
this->pet = pet;
this->count = count;
}
Pet* getPet() {
return this->pet;
}
long getCount() {
return this->count;
}
string getType() {
return this->pet->getPetType();
}
private:
Pet* pet; //需要将基类向子类转化,这里只能使用指针!
long count;//时间戳
};
class DogCatQueue {
public:
void push(Pet* pet) {
PetEnterQueue p(pet, count);
if (pet->getPetType == "dog") {
dogQ.push(p);
this->count++;
}
else if (pet->getPetType == "cat") {
catQ.push(p);
this->count++;
}
else {
cout << "error." << endl;
}
}
Pet* popAll() {
if (!dogQ.empty() && !catQ.empty()) {
if (dogQ.front().getCount() < catQ.front().getCount()) {
PetEnterQueue t = dogQ.front();
dogQ.pop();
return t.getPet();
}
else {
PetEnterQueue t = catQ.front();
catQ.pop();
return t.getPet();
}
}
else if (!dogQ.empty()) {
PetEnterQueue t = dogQ.front();
dogQ.pop();
return t.getPet();
}
else if (!catQ.empty()) {
PetEnterQueue t = catQ.front();
catQ.pop();
return t.getPet();
}
}
Dog* popDog() {
if (!dogQ.empty()) {
PetEnterQueue t = dogQ.front();
dogQ.pop();
return static_cast<Dog*>(t.getPet()); //运行时 dynamic_cast 的操作数必须包含多态类类型
//基类向子类转化,只能使用指针
}
}
Cat* popCat() {
if (!catQ.empty()) {
PetEnterQueue t = catQ.front();
catQ.pop();
return static_cast<Cat*>(t.getPet()); //运行时 dynamic_cast 的操作数必须包含多态类类型
}
}
bool isEmpty() {
return dogQ.empty() && catQ.empty();
}
bool isDogEmpty() {
return dogQ.empty();
}
bool isCatEmpty() {
return catQ.empty();
}
private:
queue<PetEnterQueue> dogQ;
queue<PetEnterQueue> catQ;
long count;
};