猫狗队列

功能要求:

  • 用户可以调用push方法将cat类或dog类的实例放入队列中;
  • 用户可以调用pollAll方法,将队列中所有的实例按照进队列的先后顺序依次弹出;
  • 用户可以调用pollDog方法,将队列中dog类的实例按照进队列的先后顺序依次弹出;
  • 用户可以调用pollCat方法,将队列中cat类的实例按照进队列的先后顺序依次弹出;
  • 用户可以调用isEmpty方法,检查队列中是否还有dog或cat的实例;
  • 用户可以调用isDogEmpty方法,检查队列中是否有dog类的实例;
  • 用户可以调用isCatEmpty方法,检查队列中是否有cat类的实例。

 

Pet.h

#ifndef _PET_H
#define _PET_H
#include <string>
using namespace std;

class Pet{
private:
    string type;

public:
    Pet(){}
    Pet(string type){
        this->type = type;
    }
    string getPetType(){
        return type;
    }
};

class Dog :public Pet{
public:
    Dog() :Pet("dog") {}
};

class Cat :public Pet{
public:
    Cat() :Pet("cat") {}
};

#endif

PetEnterQueue.h

#ifndef _PETENTERQUEUE_H
#define _PETENTERQUEUE_H
#include "Pet.h"
using namespace std;

class PetEnterQueue {
private:
    Pet pet;
    long count
        ;
public:
    PetEnterQueue(Pet pet, long count) {
        this->pet = pet;
        this->count = count;
    }

    Pet getPet() {
        return this->pet;
    }

    long getCount() {
        return this->count;
    }

    string getEnterPetType() {
        return this->pet.getPetType();
    }
};
#endif

CatDogQueue.h

#ifndef _CATDOGQUEUE_H
#define _CATDOGQUEUE_H
#include"PetEnterQueue.h"
#include"Pet.h"
#include<iostream>
#include<queue>
using namespace std;

class CatDogQueue {
private:
    queue<PetEnterQueue> dogQ;
    queue<PetEnterQueue> catQ;
    long count;

public:
    void push(Pet pet){
        if (pet.getPetType() == "dog") {
            this->dogQ.push(PetEnterQueue(pet, count++));
        }
        else if(pet.getPetType()=="cat"){
            this->catQ.push(PetEnterQueue(pet, count++));
        }
    }

    Pet 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{
            throw runtime_error("Error empty queue.");
        }
    }

    Dog popDog(){
        if (!dogQ.empty()){
            Pet tmpP = dogQ.front().getPet();
            Dog tmpD;
            Pet* pd = &tmpD;
            *pd = tmpP;
            dogQ.pop();
            return tmpD;
        }
        else{
            throw runtime_error("Error empty dog queue.");
        }
    }

    Cat popCat(){
        if (!catQ.empty()){
            Pet tmpP = catQ.front().getPet();
            Cat tmpC;
            Pet* pc = &tmpC;
            *pc = tmpP;
            catQ.pop();
            return tmpC;
        }
        else{
            throw runtime_error("Error empty cat queue.");
        }
    }


    bool isEmpty(){
        return dogQ.empty() && catQ.empty();
    }

    bool isDogEmpty(){
        return dogQ.empty();
    }

    bool isCatEmpty(){
        return catQ.empty();
    }
};

#endif

test.cpp

#include <iostream>
#include "CatDogQueue.h"

using namespace std;
int main()
{
    CatDogQueue test;
    if (test.isEmpty())
        cout << "All queue is empty!" << endl;
    test.push(Dog());
    if (!test.isEmpty())
        cout << "All queue is not empty!" << endl;
    if (!test.isDogEmpty())
        cout << "Dog queue is not empty!" << endl;
    if (test.isCatEmpty())
        cout << "Cat queue is Empty!" << endl;
    for (int i = 0; i < 2; i++)
    {
        test.push(Cat());
        test.push(Dog());
    }
    cout << "popAll:" << test.popAll().getPetType() << endl;
    cout << "popDog:" << test.popDog().getPetType() << endl;
    cout << "popCat:" << test.popCat().getPetType() << endl;
    cout << "popAll:" << test.popAll().getPetType() << endl;
    cout << "popAll:" << test.popAll().getPetType() << endl;
    if (test.isEmpty())
        cout << "All queue is empty!" << endl;

    return 0;

 

posted @ 2019-07-27 16:07  木子石页  阅读(169)  评论(0编辑  收藏  举报