算法学习10-猫狗队列

算法学习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;
}

文章到最后,请让我们来参照一下大佬的文章。

发布了27 篇原创文章 · 获赞 1 · 访问量 1042

猜你喜欢

转载自blog.csdn.net/qq_45205390/article/details/104088839
今日推荐