[자료구조론/C] 자료구조론 4편 큐

1 분 소요

선입선출 자료구조이다. C++ 덱 컨테이너의 하위호환으로 생각하면 되려나.

큐의 ADT

enqueue와 dequeue이 두 가지가 핵심. 자료구조를 처음 가르쳐주셨던 교수님의 성함을 이니셜로 따면 디큐였는데 디큐 디큐 할 때마다 그분이 떠오른다. 아무튼 c로 구현하자면

void QueueInit(Queue * pq);
int QIsEmpty(Queue * pq);
void Enqueue(Queue * pq, Data data);
Data Dequeue(Queue * pq);
Data QPeek(Queue * pq);

정도가 되겠다.

연결리스트 기반의 큐 구현

  • 헤더 파일
#ifndef __LB_QUEUE_H__
#define __LB_QUEUE_H__
#define TRUE 1
#define FALSE 0

typedef int Data;

typedef struct _node
{
    struct _node * next;
    Data data;
} Node;

typedef struct _lQueue
{
    Node *front;
    Node *rear;
} LQueue;

typedef LQueue Queue;

void QueueInit(Queue * pq);
int QIsEmpty(Queue * pq);
void Enqueue(Queue * pq, Data data);
Data Dequeue(Queue * pq);
Data QPeek(Queue * pq);
  • 메서드 구현한 c 파일
#include <stdio.h>
#include <stdlib.h>
#include "LB_QUEUE.h"

void QueueInit(Queue * pq)
{
    pq->front = NULL;
    pq->rear = NULL;
}

int QIsEmpty(Queue *pq)
{
    if(pq->fornt == NULL) return FALSE;
    else TRUE;
}

void Enqueue(Queue *pq, Data data)
{
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;

    if(QIsEmpty(pq)) {
        pq->front = newNode;
        pq->rear = newNode;
    }

    else {
        pq->rear->next = newNode;
        pq->rear = newNode;
    }
}

Data Dequeue(Queue *pq)
{
    Node *rnode;
    Data rdata;

    if(QIsEmpty(pq)) {
        printf("Queue is empty");
        exit(-1);
    }

    rnode = pq->front;
    rdata = pq->front->data;

    pq->front = pq->front->next;
    free(rnode);

    return rdata;
}

Data QPeek(Queue *pq)
{
    if(QIsEmpty(pq)) {
        printf("Queue is empty");
        exit(-1);
    }

    return pq->front->data;
}
  • main 파일
#include <stdio.h>
#include "ListBaseQueue.h"

int main()
{
    Queue q;
    QueueInit(&q);

    Enqueue(&q, 1);
    Enqueue(&q, 2);
    Enqueue(&q, 3);

    while(!QIsEmpty(&q)){
        printf("%d ", Dequeue(&q));
    }

    return 0;
}

결과는 1 2 3일 것이다.

댓글남기기