5.3.2 큐 구현

먼저 동적으로 큐를 생성하는 함수를 작성합시다.

EHQueue *New_EHQueue()
{

여기서 설계한 큐는 연결 리스트이므로 연결리스트를 동적으로 생성하여 반환합니다. 이처럼 이미 작성한 기능을 이용하여 전달하는 역할만 하는 함수를 래퍼(Wrapper) 함수라고 부릅니다.

    return New_LinkedList();
}

동적으로 생성한 큐를 소멸하는 함수도 래퍼 함수로 작성합니다.

void Delete_EHQueue(EHQueue *ehq)
{
    Delete_LinkedList(ehq);
}

큐에 자료를 보관하는 함수도 연결리스트에 순차 보관하는 함수를 호출하는 래퍼 함수로 작성합니다.

void EHQueue_Put(EHQueue *ehq, Element data)
{
    LinkedList_PushBack(ehq,data);
}

큐에서 자료를 꺼내는 함수를 작성합시다.

Element EHQueue_Get(EHQueue *ehq)
{
    Element element = 0;

만약 큐가 비어있지 않을 때 처리할 코드를 작성합시다.

    if( ! EHQueue_IsEmpty(ehq))
    {

연결리스트에 처음 보관한 자료를 가진 노드의 위치 정보를 얻어옵니다.

        Link first = LinkedList_Begin(ehq);

그리고 그 위치의 보관한 자료를 반환할 element에 설정합니다.

        element = first->data;

이제 해당 노드를 연결리스트에서 제거합니다.

        LinkedList_Erase(ehq,first);
    }

element를 반환합니다.

    return element;
}

큐가 비었는지 확인하는 함수는 연결리스트의 usage 멤버 값이 0인지 확인한 결과를 반환합니다.

int EHQueue_IsEmpty(EHQueue *ehq)
{
    return ehq->usage == 0;
}

다음은 EHQueue.c 파일의 내용입니다.

//EHQueue.c
#include "EHQueue.h"
EHQueue *New_EHQueue()
{
    return New_LinkedList();	
}
void Delete_EHQueue(EHQueue *ehq)
{
    Delete_LinkedList(ehq);	
}
void EHQueue_Put(EHQueue *ehq, Element data)
{
    LinkedList_PushBack(ehq,data);
}
Element EHQueue_Get(EHQueue *ehq)
{
    Element element = 0;
    if( ! EHQueue_IsEmpty(ehq))
    {
        Link first = LinkedList_Begin(ehq);
        element = first->data;
        LinkedList_Erase(ehq,first);
    }
    return element;
}
int EHQueue_IsEmpty(EHQueue *ehq)
{
    return ehq->usage == 0;
}