题目要求:
实现一种狗猫队列的结构,要求如下:用户可以调用add方法将cat类或dog类的实例放入队列中;用户可以调用pollAll方法,将队列中所有的实例按照进队列的先后顺序依次弹出;用户可以调用pollDog方法,将队列中dog类的实例按照进队列的先后顺序依次弹出;用户可以调用pollCat方法,将队列中cat类的实例按照进队列的先后顺序依次弹出;用户可以调用isEmpty方法,检查队列中是否还有dog或cat的实例;用户可以调用isDogEmpty方法,检查队列中是否有dog类的实例;用户可以调用isCatEmpty方法,检查队列中是否有cat类的实例。
宠物、狗和猫的类如下:
public class Pet { private String type;public Pet(String type){this.type=type:}
public String getPetTypeO I return this.type;}
public class Dog extends Pet I public DogO I super("dog"):1}
public class Cat extends Pet I public CatO I super("cat"):I}
#include<iostream>
#include<string>
#include<queue>
#include<stdexcept>//标准异常库
using namespace std;
//猫狗队列
//在C++中,类是不能加权限修饰符的,只有类的成员或者继承的时候才能加。
//这里是public继承,意思是Pet中所有的访问权限在Dog中不变,如果是peivate继承,那么是说Pet中的所有成员变成Dog的私有成员。
//在子类的构造函数中调用父类的有参构造函数就是下面这么用Cat():Pet("Cat"){};
class Pet
{
private:
string type;
public:
Pet(string type){
this->type = type;
}
Pet(){}
string getPetType(){
return this->type;
}
};
class Dog: public Pet
{
public:
Dog():Pet("dog"){}
};
class Cat: public Pet
{
public:
Cat():Pet("cat"){}
};
/************************以上为题目给出原始接口***********************/
//使用一个带时间戳的Pet类区分猫狗的进入顺序
class PetTimeStamp
{
private:
Pet myPet;
long timeStamp;
public:
//构造函数后面加了:是初始化列表,初始化myPet为p
PetTimeStamp(Pet p, long count):myPet(p){
this->timeStamp = count;
}
Pet getPet(){
return myPet;
}
long getTimeStamp(){
return timeStamp;
}
string getPetType(){
return myPet.getPetType();
}
};
猫狗队列类,这列面有两个队列,每个队列的元素是加了时间戳的Pet类
class CatDogQ
{
private:
queue<PetTimeStamp> dogQ,catQ;
long timeStamp;
public:
CatDogQ(){
timeStamp = 0;
}
void push(Pet pet);
Pet popAll();
Dog popDog();
Cat popCat();
bool isEmpty();
bool isDogEmpty();
bool isCatEmpty();
};
//猫狗入队,入队的同时打上时间戳
void CatDogQ::push(Pet pet)
{
if(pet.getPetType() == "dog")
dogQ.push(PetTimeStamp(pet,this->timeStamp++));
else if(pet.getPetType() == "cat")
catQ.push(PetTimeStamp(pet,this->timeStamp++));
else
throw runtime_error("err, not dog or cat!");
}
由于是两个队列,因此要按照时间戳弹出,区分三种情况
Pet CatDogQ::popAll()
{
if(!dogQ.empty() && !catQ.empty())//如果二者都不为空,按照时间错大小依次弹出
{
if(dogQ.front().getTimeStamp() < catQ.front().getTimeStamp())
{
Pet tmp;
tmp = dogQ.front().getPet();
dogQ.pop();
return tmp;
}
else
{
Pet tmp;
tmp = catQ.front().getPet();
catQ.pop();
return tmp;
}
}
else if(!dogQ.empty())
{
Pet tmp;
tmp = dogQ.front().getPet();
dogQ.pop();
return tmp;
}
else if(!catQ.empty())
{
Pet tmp;
tmp = catQ.front().getPet();
catQ.pop();
return tmp;
}
else
{
throw runtime_error("Error ,empty queue!");
}
}
Dog CatDogQ::popDog()
{
if(!dogQ.empty())
{
Pet tmpP = dogQ.front().getPet();
Dog tmp;
Pet *p = &tmp;
*p = tmpP;
dogQ.pop();
return tmp;
}
else
throw runtime_error("Error,empty dog queue!");
}
Cat CatDogQ::popCat()
{
if(!catQ.empty())
{
Pet tmpP = catQ.front().getPet();
Cat tmp;
Pet *p = &tmp;
*p = tmpP;
catQ.pop();
return tmp;
}
else
throw runtime_error("Error,empty cat queue!");
}
bool CatDogQ::isEmpty()
{
return catQ.empty() && dogQ.empty();
}
bool CatDogQ::isCatEmpty()
{
return catQ.empty();
}
bool CatDogQ::isDogEmpty()
{
return dogQ.empty();
}
int main()
{
CatDogQ cdq;
if(cdq.isEmpty())
cout<<"All queue is empty!"<<endl;
cdq.push(Dog());
if(!cdq.isDogEmpty())
cout<<"Dog queue is not empty!"<<endl;
if(!cdq.isCatEmpty())
cout<<"Cat queue is not empty!"<<endl;
for(int i=0;i<2;i++)
{
cdq.push(Cat());
cdq.push(Dog());
}
cout<<"popAll:"<<cdq.popAll().getPetType()<<endl;
cout<<"popDog:"<<cdq.popDog().getPetType()<<endl;
cout<<"popCat:"<<cdq.popCat().getPetType()<<endl;
cout<<"popAll:"<<cdq.popAll().getPetType()<<endl;
cout<<"popAll:"<<cdq.popAll().getPetType()<<endl;
if(cdq.isEmpty())
cout<<"All queue is empty!"<<endl;
return 0;
}
个人
[1] 猫狗队列代码
[2] 个人主页:http://bamutian.github.io/
[3] 个人公众号:liuwangTalk
参考文献
[1] c++——猫狗队列:https://blog.csdn.net/u014228447/article/details/80887714