티스토리 뷰

[소스 코딩]


■ CircularQueue.h


#ifndef CIRCULARQUEUE_H_
#define CIRCULARQUEUE_H_
 
#define TRUE     1
#define FALSE    0
 
#define QUE_LEN  100
 
typedef struct _cQueue
{
    int front;                       // 삭제할 데이터의 위치를 가리키는 변수
    int rear;                        // 삽입할 데이터의 위치를 가리키는 변수
    int queArr[QUE_LEN];             // QUE_LEN 길이를 갖는 큐 배열
} CQueue;
 
typedef CQueue Queue;
 
void QueueInit(Queue * pq);          // 큐 초기화 함수
int QIsEmpty(Queue * pq);            // 큐에 데이터가 존재하는지 확인하는 함수
 
void Enqueue(Queue * pq, int data);  // 큐에 데이터를 저장하는 함수
int Dequeue(Queue * pq);             // 큐의 데이터를 반환하는 함수
int QPeek(Queue * pq);               // 큐의 데이터를 조회하는 함수
 
#endif
cs



■ CircularQueue.c


#include <stdio.h>
#include <stdlib.h>            // exit 함수를 사용하기 위함
#include "CircularQueue.h"
 
// 큐 초기화 함수 //
void QueueInit(Queue * pq)
{
    pq->front = 0;
    pq->rear = 0;
}
 
// 큐에 데이터가 존재하는지 확인하는 함수 //
int QIsEmpty(Queue * pq)
{
    if(pq->front == pq->rear)
        return TRUE;
 
    else
        return FALSE;
}
 
// 큐의 다음 위치에 해당하는 배열의 인덱스 값을 반환하는 함수 //
int NextPosIdx(int pos)
{
    if(pos == QUE_LEN-1)
        return 0;
 
    else
        return pos+1;
}
 
// 큐에 데이터를 저장하는 함수 //
void Enqueue(Queue * pq, int data)
{
    if(NextPosIdx(pq->rear) == pq->front)
    {
        printf("Queue Memory FULL!!");
        exit(-1);
    }
 
    pq->rear = NextPosIdx(pq->rear);
    pq->queArr[pq -> rear] = data;
}
 
// 큐의 데이터를 반환하는 함수 //
int Dequeue(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Empty!!");
        exit(-1);
    }
 
    pq->front = NextPosIdx(pq->front);
    return pq->queArr[pq->front];
}
 
// 큐의 데이터를 조회하는 함수 //
int QPeek(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Empty!!");
        exit(-1);
    }
 
    return pq->queArr[NextPosIdx(pq->front)];
}
cs



■ 사용되는 함수 설명


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


- 'front'를 '0'으로 초기화

- 'rear'를 '0'으로 초기화



int QIsEmpty(Queue * pq)
{
    if(pq->front == pq->rear)
        return TRUE;
 
    else
        return FALSE;
}
cs


// 'front'의 값과 'rear'의 값이 같을 경우

- 'TRUE'를 반환

  ※ 큐에 데이터가 비워져 있음


// 아닐 경우

- 'FALSE'를 반환

  ※ 큐에 데이터가 1개 이상 존재



int NextPosIdx(int pos)
{
    if(pos == QUE_LEN-1)
        return 0;
 
    else
        return pos+1;
}
cs


// 인자로 받은 '변수의 값'이 '배열 총 길이의 -1 한 값'과 같을 경우

- '0'을 반환


// 아닐 경우

- '현재 값에서 +1한 값'을 반환



void Enqueue(Queue * pq, int data)
{
    if(NextPosIdx(pq->rear) == pq->front)
    {
        printf("Queue Memory FULL!!");
        exit(-1);
    }
 
    pq->rear = NextPosIdx(pq->rear);
    pq->queArr[pq->rear] = data;
}
cs


// 'NextPosIdx 함수'에 'rear'의 값을 넣어서 반환된 값이 'front' 값과 같을 경우

- 메모리가 꽉 채워졌다는 메시지를 출력

- 프로그램 종료


// 아닐 경우

- 'rear'에다 'NextPosIdx 함수'에 'rear'의 값을 넣어서 반환된 값을 저장

- 큐의 'rear' 값 위치에 'data'를 저장



int Dequeue(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Empty!!");
        exit(-1);
    }
 
    pq->front = NextPosIdx(pq->front);
    return pq->queArr[pq->front];
}
cs


// 큐에 데이터가 비워져 있을 경우

- 메모리가 비워져 있다는 메시지를 출력

- 프로그램 종료


// 아닐 경우

- 'front'에다 'NextPosIdx 함수'에 'front'의 값을 넣어서 반한된 값을 저장

- 큐의 'front'값 위치의 'data'를 반환



int QPeek(Queue * pq)
{
    if(QIsEmpty(pq))
    {
        printf("Queue Memory Empty!!");
        exit(-1);
    }
 
    return pq->queArr[NextPosIdx(pq->front)];
}
cs


// 큐에 데이터가 비워져 있을 경우

- 메모리가 비워져 있다는 메시지를 출력

- 프로그램 종료


// 아닐 경우

- 큐의 'front'값 위치의 'data'를 반환



■ CircularQueueMain.c


#include <stdio.h>
#include "CircularQueue.h"
 
int main(void)
{
    Queue Q;
    QueueInit(&Q);
 
    Enqueue(&Q, 1);    Enqueue(&Q, 2);
    Enqueue(&Q, 3);    Enqueue(&Q, 4);
 
    while(!QIsEmpty(&Q))
        printf("%d ", Dequeue(&Q));
 
    return 0;
}
cs


- 배열기반 큐 구조체 Q 선언

- Q 초기화

- 데이터 저장

  ※ 저장 순서: 1 → 2 → 3 → 4


- Q에 데이터가 비워질 때까지 큐에 있는 데이터 반환



■ 실행결과


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함