猫狗队列(C++实现)

摘要:
实现一种猫狗队列的结构,要求如下:1.用户可以调用add方法将cat类或者dog类的实例放入队列中;2.用户可以调用pollAll方法,将队列中所有的实例按照进队列的先后顺序依次弹出;3.用户可以调用pollDog方法,将队列中的dog类的实例按照进队列的先后循序一次弹出;4.用户可以调用pollCat方法,将队列中的cat类的实例按照进队列的先后循序依次弹出;5.用户可以调用isEmpty方法,

实现一种猫狗队列的结构,要求如下:

1.用户可以调用add方法将cat类或者dog类的实例放入队列中;

2.用户可以调用pollAll方法,将队列中所有的实例按照进队列的先后顺序依次弹出;

3.用户可以调用pollDog方法,将队列中的dog类的实例按照进队列的先后循序一次弹出;

4.用户可以调用pollCat方法,将队列中的cat类的实例按照进队列的先后循序依次弹出;

5.用户可以调用isEmpty方法,检查队列中是否还有dog或者cat的实例;

6.用户可以调用isDogEmpty方法,检查队列中是否有dog类的实例;

7.用户可以调用isCatEmpty方法,检查队列中是否有cat类的实例。

代码:

pet.h:

#ifndef _PET_H
#define _PET_H
#include <iostream>
#include <string>
using namespace std;
class Pet
{
public:
Pet(string type){
this->type = type;
}
string getPetType(){
return this->type;
}
private:
string type;
};
class Dog:public Pet{
public:
Dog():Pet("dog"){
std::cout << "doging !!!" << ' ';
}
};
class Cat:public Pet{
public:
Cat():Pet("cat"){
std::cout << "cating !!!" << ' ';
}
};
#endif
PetEnterQueue.h
#ifndef _PETSTAMP_H
#define _PETSTAMP_H
#include <iostream>
#include "pet.h"
class PetEnterQueue{
public:
PetEnterQueue(Pet p,long count):pet(p){
this->pet = p;
this->count = count;
}
Pet getPet(){
return this->pet;
}
long getCount(){
return this->count;
}
string getEnterPetType(){
return this->pet.getPetType();
}
private:
Pet pet;
long count;
};
#endif
DogCatQue.h:
#ifndef _CATDOGQUE_H
#define _CATDOGQUE_H
#include <iostream>
#include "pet.h"
#include "PetEnterQueue.h"
#include "pet.h"
#include <queue>
class DogCatQueue{
public:
DogCatQueue();
void push(Pet pet);
Pet pollAll();
Pet pollDog();
Pet pollCat();
bool isEmpty();
bool isDogEmpty();
bool isCatEmpty();
bool dogQempty();
bool catQempty();
private:
queue <PetEnterQueue> dogQ;
queue <PetEnterQueue> catQ;
long count;
};
#endif
DogCatQue.cpp
#include "DogCatQue.h"
#include <stdbool.h>
DogCatQueue::DogCatQueue(){
count = 0;
};
void DogCatQueue::push(Pet pet){
if("dog"==pet.getPetType())
{
dogQ.push(PetEnterQueue(pet,++count));
}
else{
catQ.push(PetEnterQueue(pet,++count));
}
return ;
};
Pet DogCatQueue::pollAll(){
if(!isEmpty()){
if(dogQ.front().getCount()<catQ.front().getCount())
{
Pet tem = dogQ.front().getPet();
dogQ.pop();
return tem;
}
else{
Pet tm = catQ.front().getPet();
catQ.pop();
return tm;
}
}
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;
}
};
Pet DogCatQueue::pollDog(){
if(!isDogEmpty()){
Pet tem_1 = dogQ.front().getPet();
dogQ.pop();
return tem_1;
}
else{
std::cout << "isDogEmpty!!!" << ' ';
}
};
Pet DogCatQueue::pollCat(){
if(!isCatEmpty()){
Pet tem_2 = catQ.front().getPet();
catQ.pop();
return tem_2;
}
else{
std::cout << "isCatEmpty!!!" << ' ';
}
}
bool DogCatQueue::isEmpty(){
if(dogQ.empty()&&catQ.empty()){
return true;
}
else{
return false;
}
}
bool DogCatQueue::isDogEmpty(){
if(dogQ.empty()){
return true;
}
else{
return false;
}
}
bool DogCatQueue::isCatEmpty(){
if(catQ.empty()){
return true;
}
else{
return false;
}
}
test.cpp
#include "DogCatQue.h"
#include <iostream>
#include "DogCatQue.cpp"
using namespace std;
bool DogCatQueue::dogQempty(){
if(dogQ.empty()){
return true;
}
else{
return false;
}
};
bool DogCatQueue::catQempty(){
if(catQ.empty()){
return true;
}
else{
return false;
}
};
int main(){
DogCatQueue DC;
if(DC.dogQempty()){
std::cout << "dogQ is empty!!!" << ' ';
}
if(DC.catQempty()){
std::cout << "catQ is empty!!!" << ' ';
}
for(int i=0;i<2;i++){
DC.push(Dog());
DC.push(Cat());
}
cout << "popAll:" << DC.pollAll().getPetType() << endl;
cout << "popCat:" << DC.pollCat().getPetType() << endl;
cout << "popAll:" << DC.pollAll().getPetType() << endl;
cin.get();
if(DC.isEmpty()){
cout << "All queue is empty!" << endl;
cin.get();
}
return 0;
}
程序运行结果:
猫狗队列(C++实现)第1张

免责声明:文章转载自《猫狗队列(C++实现)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nodejs Express笔记Linux shell脚本中shift的用法说明【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

svn常见问题汇总

要添加到版本库,必须更新工作副本中的文件。5.更新时,系统会提示您文件冲突,将工作副本中的文件与服务器中的文件进行比较“当版本管理系统更改计算机上的工作副本时”,它会尝试将您的意图写入计算机上的日志文件,因此日志文件记录可能与您的上次工作状态不一致。Subversion客户端将在提交内容之前在本地工作副本中写入日志。首先删除隐藏文件夹中tmp下的临时文件。服...

CentOS 7 优化TCP链接

在优化服务器配置时,Summary发现服务器端的WAIT连接上有大量的TIME,需要进行优化。Tomcat案例查询与Tomcat对应的端口的tcp链接,发现存在大量TIME_WAIT链接,以及一些其他状态连接,总计400+。...

Python生成pyd文件

Python的脚本文件是开源的,量化策略的安全性没有保障。那么要对Python代码进行混淆、加密保护。Python有py、pyc、pyw、pyo、pyd等文件格式。vcvarsall.bat是VC编译Python环境的文件之一。方案1:修改Python安装目录的文件设置方案2:修改注册表我采用方案1,亲测可用。测试结果,用py2exe可以正常使用pyd文件。...

数据库软考易混淆知识之信息化基础、项目管理

2、 关键路径关键路径是活动图中最长的路径示例:图中显示了软件项目的活动图,其中固定点表示项目里程碑,连接顶点的边表示包含的活动,边上的数字表示活动持续时间的天数,则完成项目的最短时间为()天,活动EH和IJ的放松时间分别为()日。...

【Mybatis-Plus】使用updateById()、update()将字段更新为null或者空

我检查了以下项目的配置,发现字段级别设置为NOT_由空引起。2不为空,但默认更新策略为Not_ NULL:解决方案1。设置全局字段策略加:classpath:#字段策略IGNORED:NOT_NULL:NOT_EMPTY:NOT_Null2。为所需字段设置单独的字段策略很麻烦。...

TCP UDP (转)

在互联网的早期,NCP协议用于主机之间的互连。该协议本身存在许多缺陷,例如:无法互连不同的主机,无法互连不同操作系统,并且没有纠错功能。为了改善这个缺点,Daniel提出了TCP/IP协议。现在几乎所有的操作系统都实现了TCP/IP协议栈。TCP/IP协议栈主要分为四层:应用层、传输层、网络层和数据链路层。每个层都有相应的协议。如下图所示,所谓的协议是双方之...