隊列的常見面試題總結

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章