队列的常见面试题总结

1.实现猫狗队列

#include<string>
#include<queue>

//宠物类
class Pet
{
public:
    Pet(string type)
        :_type(type)
    {}

    string GetPetType()
    {
        return _type;
    }


private:
    string _type;
};

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

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

要求:

  • 用户可以调用add方法将cat类或dog类的实例放入队列中;
  • 用户可以调用Pop方法,将队列中所有的实例都按照进队列的先后顺序一次弹出;
  • 用户可以调用PopDog方法,将队列中的Dog类按照进队列的先后顺序弹出;
  • 用户可以调用IsEmpty的方法,检查队列中是否还有Dog或cat的实例;
  • 用户可以调用IsDogEmpty的方法,检查队列中是否有Dog的实例;
  • 用户可以调用IsCatEmpty的方法,检查队列中是否有cat实例;
    代码实现:

//为宠物重新定义一个类,加上该宠物入队列的时间(计数),目的是为了出队列
class PetEnterQueue
{
public:
    PetEnterQueue(Pet pet,long count=0)
        :_count(count)
        ,_pet(pet)
    {}

    Pet GetPet()
    {
        return _pet;
    }

    int GetCount()
    {
        return _count;
    }

    string GetEnterPetType()
    {
        return _pet.GetPetType();
    }

private:
    int _count;
    Pet _pet;
};

//实现猫狗队列
class CatAndDogQueue
{
public:
    CatAndDogQueue()
        :_count(0)
    {}
    void Add(Pet pet)
    {
        if(pet.GetPetType().compare("Dog") == 0)
        {
            _count++;
            DogQ.push(PetEnterQueue(pet,_count));
        }
        if(pet.GetPetType().compare("Cat") == 0)
        {
            _count++;
            CatQ.push(PetEnterQueue(pet,_count));
        }
    }

    void Pop()
    {
        if(DogQ.empty() && CatQ.empty())
            return;
        if(!DogQ.empty() && !CatQ.empty())
        {
            //比较谁先入队列,则谁先出队列

            PetEnterQueue d = DogQ.front();
            PetEnterQueue c = CatQ.front();
            if(d.GetCount() > c.GetCount())
                CatQ.pop();
            else
                DogQ.pop();
        }
        else if(!DogQ.empty())
        {
            DogQ.pop();
        }
        else
        {
            CatQ.pop();
        }
    }

    void PopDog()
    {
        if(!DogQ.empty())
            DogQ.pop();
    }

    void PopCat()
    {
        if(!CatQ.empty())
            CatQ.pop();
    }

    bool IsEmpty()
    {
        if(DogQ.empty() && CatQ.empty())
            return true;
        return false;
    }

    bool IsDogEmpty()
    {
        if(DogQ.empty())
            return true;
        return false;
    }

    bool IsCatEmpty()
    {
        if(CatQ.empty())
            return true;
        return false;
    }

private:
    queue<PetEnterQueue> DogQ;
    queue<PetEnterQueue> CatQ;
    int _count;
};

测试代码:

void funtest()
{
    Cat c1;
    Cat c2;
    Cat c3;
    Cat c4;
    Dog d1;
    Dog d2;
    Dog d3;

    CatAndDogQueue q;
    q.Add(c1);
    q.Add(d1);
    q.Add(c2);
    q.Add(c3);
    q.Add(d2);
    q.Add(d3);
    q.Add(c4);

    q.Pop();
}

int main()
{
    //Cat c;
    //PetEnterQueue q(c,0);
    funtest();
    getchar();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值