공부중

[자료구조] 큐(Queue)-2 본문

Programing/자료구조

[자료구조] 큐(Queue)-2

곤란 2013. 1. 7. 17:22
반응형

 

이전 글에 이어서 원형 큐를 구현 해보겠습니다.

 

 

Candy.h

#pragma once

 

enum eCandy

{

    eRed = 1,

    eGreen,

    eBlack,

};

 

class Candy

{

public:

    Candy();

    virtual ~Candy();

    virtual void SeeCandy() = 0;

 

private:

 

};

 

class CRedCandy    : public Candy

{

public:

    CRedCandy();

    virtual ~CRedCandy();

    void SeeCandy();

 

private:

 

};

 

class CGreenCandy    : public Candy

{

public:

    CGreenCandy();

    virtual ~CGreenCandy();

    void SeeCandy();

 

private:

 

};

 

 

class CBlackCandy    : public Candy

{

public:

 

        CBlackCandy();

        virtual ~CBlackCandy();

 

        void SeeCandy();

private:

 

};

Candy.cpp

#include <iostream>

 

#include "Candy.h"

 

Candy::Candy()

{

    std::cout<<"Candy 생성자"<<std::endl;

}

 

Candy::~Candy()

{

    std::cout<<"Candy 소멸자"<<std::endl;

}

 

CRedCandy::CRedCandy()

{

    std::cout<<"빨간사탕 생성자"<<std::endl;

}

 

CRedCandy::~CRedCandy()

{

        std::cout<<"음... 딸기맛이네.."<<std::endl;

}

 

CGreenCandy::CGreenCandy()

{

    std::cout<<"초록사탕 생성자"<<std::endl;

}

 

CGreenCandy::~CGreenCandy()

{

        std::cout<<"멜론맛이군.."<<std::endl;

}

 

CBlackCandy::CBlackCandy()

{

    std::cout<<"검은사탕 생성자"<<std::endl;

}

 

CBlackCandy::~CBlackCandy()

{

    std::cout<<"아.. 계피맛이야!!!!"<<std::endl;

}

 

void CRedCandy::SeeCandy()

{

    std::cout<<"빨간 사탕이네"<<std::endl;

}

 

void CGreenCandy::SeeCandy()

{

    std::cout<<"초록색 사탕이네"<<std::endl;

}

 

void CBlackCandy::SeeCandy()

{

    std::cout<<"검은 사탕이네"<<std::endl;

}

Queue.h

#pragma once

 

#include "Candy.h"

 

static const int ARRAY_MIN = 0;

static const int ARRAY_MAX = 5;

 

enum eMenu

{

    eAdd = 1,

    eDel,

    eExit,

};

 

class CQueue

{

public:

 

    CQueue();

    ~CQueue();

 

    int Start();

    int NextIndex(int nGetIndex);

    //다음 인덱스를 반환하는 함수

    //인덱스가 최대치일경우 배열의 맨 처음으로 반환

 

    bool ISEmpty();    //큐가 비었을때 true 그렇지 않을때 false

    bool ISFull();    //큐가 가득 찻을때 true 그렇지 않을때 flase

 

    void EnQueue();    //큐에 데이터를 넣기

    void DeQueue();    //저장순서가 가장 앞선 데이터를 삭제

 

    

    void DelAll();

 

private:

 

    int nFront;

    int nRear;

 

    static Candy    *ArrayQueue[ARRAY_MAX];

 

};

Queue.cpp

#include <iostream>

 

#include "Queue.h"

 

Candy    *CQueue::ArrayQueue[ARRAY_MAX];

 

CQueue::CQueue()

{

    std::cout<<"CQueue 생성자"<<std::endl;

 

    this->nFront    = ARRAY_MIN;

    this->nRear        = ARRAY_MIN;

}

 

CQueue::~CQueue()

{

    std::cout<<"CQueue 소멸자"<<std::endl;

}

 

int CQueue::Start()

{

    int nChoice = 0;

 

    while(true)

    {

        std::cout<<"1. 사탕넣기, 2. 사탕먹기. 3.사탕버리기"<<std::endl;

        std::cin>>nChoice;

 

        switch (nChoice)

        {

        case eAdd:

            this->EnQueue();

            break;

        case eDel:

            this->DeQueue();

            break;

        case eExit:

            this->DelAll();

            return eExit;

        default:

            std::cout<<"잘못 선택하였습니다."<<std::endl;

            break;

        }

 

    }

}

 

int CQueue::NextIndex(int nGetIndex)

{

    if( ARRAY_MAX-1 == nGetIndex )

    {//배열 크기의 최대치일 경우

        return ARRAY_MIN;

    }

    else

    {

        return nGetIndex+1;

    }

}

 

bool CQueue::ISEmpty()

{

    if( this->nFront == this->nRear )

    {//F와 R이 서로 같으면 큐는 비어있다.

        return true;

    }

    else

    {

        return false;

    }

}

 

bool CQueue::ISFull()

{

    if( this->NextIndex(this->nRear) == nFront )

    {//R의 다음 위치가 F일 경우 가득 차 있다.

        return true;

    }

    else

    {

        return false;

    }

}

 

void CQueue::EnQueue()

{

    if( this->ISFull() )

    {//큐가 가득 찰 경우

        std::cout<<"큐가 가득 찼습니다."<<std::endl;

    }

    else

    {

        int nChoiceCandy = 0;

 

        std::cout<<"색깔을 선택해 주세요"<<std::endl;

        std::cout<<"1.빨강 , 2. 초록, 3.검정"<<std::endl;

        std::cin>>nChoiceCandy;

        switch (nChoiceCandy)

        {

        case eRed:

            this->nRear = this->NextIndex(this->nRear);

            ArrayQueue[this->nRear] = new CRedCandy;

            break;

 

        case eGreen:

            this->nRear = this->NextIndex(this->nRear);

            ArrayQueue[this->nRear] = new CGreenCandy;

            break;

 

        case eBlack:

            this->nRear = this->NextIndex(this->nRear);

            ArrayQueue[this->nRear] = new CBlackCandy;

            break;

 

        default:

            std::cout<<"잘못 선택하셧습니다."<<std::endl;

            break;

        }

 

    }

}

 

void CQueue::DeQueue()

{

    if( this->ISEmpty() )

    {

        std::cout<<"큐가 비어있습니다."<<std::endl;

    }

    else

    {

        this->nFront = this->NextIndex(this->nFront);

        delete this->ArrayQueue[this->nFront];

    }

}

 

void CQueue::DelAll()

{

    while (!(this->ISEmpty()))

    {

        this->DeQueue();

    }

}

Main.cpp

#include <iostream>

 

#include "Queue.h"

 

int main()

{

    CQueue Queue;

 

    Queue.Start();

 

    return 0;

}

 

실행 결과

배열의 크기는 5이나 앞 글대로 구현 하였으므로

빈 공간을 두어서 4개가 저장되었을 때 큐가 가득 찬 것으로 만들었다.

지금 소스코드를 짜다 보니 잊어버린게 생각났었는데

소멸자에 virtual을 안붙혔던게 떠올라서 이번 소스부터는 붙히려고 한다.

 

배열기반으로 원형 큐를 만들어보았다.

이것도 똑같이 링크드리스트로 구현이 가능하며

 

조금만 생각을 하면 링크드리스트 기반의 큐를 쉽게 구현할 수 있다.

 

 

반응형