猫狗队列
功能要求:
- 用户可以调用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;