功能要求:
- 用户可以调用push方法将cat类或dog类的实例放入队列中;
- 用户可以调用pollAll方法,将队列中所有的实例按照进队列的先后顺序依次弹出;
- 用户可以调用pollDog方法,将队列中dog类的实例按照进队列的先后顺序依次弹出;
- 用户可以调用pollCat方法,将队列中cat类的实例按照进队列的先后顺序依次弹出;
- 用户可以调用isEmpty方法,检查队列中是否还有dog或cat的实例;
- 用户可以调用isDogEmpty方法,检查队列中是否有dog类的实例;
- 用户可以调用isCatEmpty方法,检查队列中是否有cat类的实例。
Pet.h
#ifndef _PET_H #define _PET_H #include <string> using namespace std;class Pet{ private:string type;public:Pet(){}Pet(string type){this->type = type;}string getPetType(){return type;} };class Dog :public Pet{ public:Dog() :Pet("dog") {} };class Cat :public Pet{ public:Cat() :Pet("cat") {} };#endif
PetEnterQueue.h
#ifndef _PETENTERQUEUE_H #define _PETENTERQUEUE_H #include "Pet.h" using namespace std;class PetEnterQueue { private:Pet pet;long count; public:PetEnterQueue(Pet pet, long count) {this->pet = pet;this->count = count;}Pet getPet() {return this->pet;}long getCount() {return this->count;}string getEnterPetType() {return this->pet.getPetType();} }; #endif
CatDogQueue.h
#ifndef _CATDOGQUEUE_H #define _CATDOGQUEUE_H #include"PetEnterQueue.h" #include"Pet.h" #include<iostream> #include<queue> using namespace std;class CatDogQueue { private:queue<PetEnterQueue> dogQ;queue<PetEnterQueue> catQ;long count;public:void push(Pet pet){if (pet.getPetType() == "dog") {this->dogQ.push(PetEnterQueue(pet, count++));}else if(pet.getPetType()=="cat"){this->catQ.push(PetEnterQueue(pet, count++));}}Pet popAll() {if (!catQ.empty() && !dogQ.empty()){if (dogQ.front().getCount() < catQ.front().getCount()){Pet tmp = dogQ.front().getPet();dogQ.pop();return tmp;}else{Pet tmp = catQ.front().getPet();catQ.pop();return tmp;}}else if (!catQ.empty()){Pet tmp = catQ.front().getPet();catQ.pop();return tmp;}else if (!dogQ.empty()){Pet tmp = dogQ.front().getPet();dogQ.pop();return tmp;}else{throw runtime_error("Error empty queue.");}}Dog popDog(){if (!dogQ.empty()){Pet tmpP = dogQ.front().getPet();Dog tmpD;Pet* pd = &tmpD;*pd = tmpP;dogQ.pop();return tmpD;}else{throw runtime_error("Error empty dog queue.");}}Cat popCat(){if (!catQ.empty()){Pet tmpP = catQ.front().getPet();Cat tmpC;Pet* pc = &tmpC;*pc = tmpP;catQ.pop();return tmpC;}else{throw runtime_error("Error empty cat queue.");}}bool isEmpty(){return dogQ.empty() && catQ.empty();}bool isDogEmpty(){return dogQ.empty();}bool isCatEmpty(){return catQ.empty();} };#endif
test.cpp
#include <iostream> #include "CatDogQueue.h"using namespace std; int main() {CatDogQueue test;if (test.isEmpty())cout << "All queue is empty!" << endl;test.push(Dog());if (!test.isEmpty())cout << "All queue is not empty!" << endl;if (!test.isDogEmpty())cout << "Dog queue is not empty!" << endl;if (test.isCatEmpty())cout << "Cat queue is Empty!" << endl;for (int i = 0; i < 2; i++){test.push(Cat());test.push(Dog());}cout << "popAll:" << test.popAll().getPetType() << endl;cout << "popDog:" << test.popDog().getPetType() << endl;cout << "popCat:" << test.popCat().getPetType() << endl;cout << "popAll:" << test.popAll().getPetType() << endl;cout << "popAll:" << test.popAll().getPetType() << endl;if (test.isEmpty())cout << "All queue is empty!" << endl;return 0;