【算法】猫狗队列

题目要求:

实现一种狗猫队列的结构,要求如下:用户可以调用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘大望

谢谢你请的咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值