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;
}