算法学习10-猫狗队列
猫狗队列
问题描述
宠物、狗和猫的类如下:
<pet.h>
#ifndef _PET_H
#define _PET_H
#include <string>
using namespace std;
class Pet
{
public:
Pet(string type)
{
this->type = type;
}
string getPetType()
{
return type;
}
private:
string type;
};
class Dog:public Pet
{
public:
Dog():Pet("dog"){}
};
class Cat:public Pet
{
public:
Cat():Pet("cat"){}
};
#endif
实现一种猫狗队列的结构,要求如下:
- 用户可以调用 push 的方法,将 cat 类或者 dog 类的实例放入队列中;
- 用户可以调用 popAll 的方法,将队列中所有的实例按照进队列的先后顺序依次弹出;
- 用户可以调用 popDog 的方法,将队列中的 dog 类实例按照进队列的先后顺序依次弹出;
- 用户可以调用 popCat 的方法,将队列中的 cat 类实例按照进队列的先后顺序依次弹出;
- 用户可以调用 isEmpty 的方法,检查队列中是否还有 dog 或者 cat 类的实例;
- 用户可以调用 isDogEmpty 的方法,检查队列中是否还有 dog 类的实例;
- 用户可以调用 isCatEmpty 的方法,检查队列中是否还有 cat 类的实例。
代码实现
1.带时间戳的宠物声明及实现代码<petstamp.h>
#ifndef _PETSTAMP_H
#define _PETSTAMP_H
#include "pet.h"
class PetStamp
{
public:
PetStamp(Pet p,long count)
:pet(p)
{
this->count=count;
}
Pet getPet()
{
return pet;
}
long getCount()
{
return count;
}
string getPetType()
{
return pet.getPetType();
}
private:
Pet pet;
long count;
};
#endif
2、猫狗队列的声明代码<CatDogQue.h>
#ifndef _CATDOGQUE_H
#define _CATDOGQUE_H
#include "pet.h"
#include "petstamp.h"
#include <queue>
#include<iostream>
using namespace std;
class CatDogQue
{
public:
CatDogQue();
void push(Pet pet);
Pet popAll();
Dog popDog();
Cat popCat();
bool isEmpty();
bool isDogEmpty();
bool isCatEmpty();
private:
queue<PetStamp> dogQ;
queue<PetStamp> catQ;
long count;
};
#endif
CatDogQue::CatDogQue()
{
count = 0;
}
void CatDogQue::push(Pet pet)
{
if("dog" == pet.getPetType())
dogQ.push(PetStamp(pet,count++));
else if("cat" == pet.getPetType())
catQ.push(PetStamp(pet,count++));
else
cout<<"err,not dog or cat!";
return ;
}
Pet CatDogQue::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
{
cout<<"Error,empty queue!";
}
}
Dog CatDogQue::popDog()
{
if (!dogQ.empty())
{
Pet tmpP = dogQ.front().getPet();
Dog tmpD;
Pet *pd = &tmpD;
*pd = tmpP;
dogQ.pop();
return tmpD;
}
else
{
cout<<"Error,empty dog queue!";
}
}
Cat CatDogQue::popCat()
{
if (!catQ.empty())
{
Pet tmpP = catQ.front().getPet();
Cat tmpC;
Pet *pc = &tmpC;
*pc = tmpP;
catQ.pop();
return tmpC;
}
else
{
cout<<"Error,empty cat queue!";
}
}
bool CatDogQue::isEmpty()
{
return dogQ.empty() && catQ.empty();
}
bool CatDogQue::isDogEmpty()
{
return dogQ.empty();
}
bool CatDogQue::isCatEmpty()
{
return catQ.empty();
}
测试代码<CatDogQue.cpp>
#include "CatDogQue.h"
#include <iostream>
using namespace std;
int main()
{
CatDogQue 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 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;
}