1.实现猫狗队列
#include<string>
#include<queue>
//宠物类
class Pet
{
public:
Pet(string type)
:_type(type)
{}
string GetPetType()
{
return _type;
}
private:
string _type;
};
//dog队列
class Dog:public Pet
{
public:
Dog()
:Pet("Dog")
{}
};
//cat类
class Cat:public Pet
{
public:
Cat()
:Pet("Cat")
{}
};
要求:
- 用户可以调用add方法将cat类或dog类的实例放入队列中;
- 用户可以调用Pop方法,将队列中所有的实例都按照进队列的先后顺序一次弹出;
- 用户可以调用PopDog方法,将队列中的Dog类按照进队列的先后顺序弹出;
- 用户可以调用IsEmpty的方法,检查队列中是否还有Dog或cat的实例;
- 用户可以调用IsDogEmpty的方法,检查队列中是否有Dog的实例;
- 用户可以调用IsCatEmpty的方法,检查队列中是否有cat实例;
代码实现:
//为宠物重新定义一个类,加上该宠物入队列的时间(计数),目的是为了出队列
class PetEnterQueue
{
public:
PetEnterQueue(Pet pet,long count=0)
:_count(count)
,_pet(pet)
{}
Pet GetPet()
{
return _pet;
}
int GetCount()
{
return _count;
}
string GetEnterPetType()
{
return _pet.GetPetType();
}
private:
int _count;
Pet _pet;
};
//实现猫狗队列
class CatAndDogQueue
{
public:
CatAndDogQueue()
:_count(0)
{}
void Add(Pet pet)
{
if(pet.GetPetType().compare("Dog") == 0)
{
_count++;
DogQ.push(PetEnterQueue(pet,_count));
}
if(pet.GetPetType().compare("Cat") == 0)
{
_count++;
CatQ.push(PetEnterQueue(pet,_count));
}
}
void Pop()
{
if(DogQ.empty() && CatQ.empty())
return;
if(!DogQ.empty() && !CatQ.empty())
{
//比较谁先入队列,则谁先出队列
PetEnterQueue d = DogQ.front();
PetEnterQueue c = CatQ.front();
if(d.GetCount() > c.GetCount())
CatQ.pop();
else
DogQ.pop();
}
else if(!DogQ.empty())
{
DogQ.pop();
}
else
{
CatQ.pop();
}
}
void PopDog()
{
if(!DogQ.empty())
DogQ.pop();
}
void PopCat()
{
if(!CatQ.empty())
CatQ.pop();
}
bool IsEmpty()
{
if(DogQ.empty() && CatQ.empty())
return true;
return false;
}
bool IsDogEmpty()
{
if(DogQ.empty())
return true;
return false;
}
bool IsCatEmpty()
{
if(CatQ.empty())
return true;
return false;
}
private:
queue<PetEnterQueue> DogQ;
queue<PetEnterQueue> CatQ;
int _count;
};
测试代码:
void funtest()
{
Cat c1;
Cat c2;
Cat c3;
Cat c4;
Dog d1;
Dog d2;
Dog d3;
CatAndDogQueue q;
q.Add(c1);
q.Add(d1);
q.Add(c2);
q.Add(c3);
q.Add(d2);
q.Add(d3);
q.Add(c4);
q.Pop();
}
int main()
{
//Cat c;
//PetEnterQueue q(c,0);
funtest();
getchar();
return 0;
}