반응형





- CircularQueue.h -


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
#ifndef __C_QUEUE_H__
#define __C_QUEUE_H__ 
 
#define TRUE 1
#define FALSE 0
 
#define QUE_LEN 100 // 큐의 크기를 100으로 잡는다. 이때 원형 큐 MAX는 99이다.
typedef int Data;
 
typedef struct _cQueue
{
    int front// 큐의 시작점 F 
    int rear; // 큐의 끝점 R 
    Data queArr[QUE_LEN];
} CQueue;
 
typedef CQueue Queue; // Cqueue 구조체를 Queue로 선언한다.
 
void QueueInit(Queue *pq); // Queue를 pq로 본다(이 함수 안에서는)
int QIsEmpty(Queue *pq);
 
void Enqueue(Queue *pq, Data data);
Data Dequeue(Queue *pq);
Data QPeek(Queue *pq);
 
#endif
 
 
Crocus




- CircularQueue.c -


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include "CircularQueue.h"
 
void QueueInit(Queue *pq) // 텅 빈 경우 front와  rear은 동일위치를 가리킨다.
{
    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//  만약 현재위치가 큐길이 - 1이라면 // 즉 배열의 마지막 요소의 인덱스 값이라면
        return 0// 0을 반환(큐의 끝에 도달했으므로 회전을 돕는 함수이다)
 
    else
        return pos + 1// 그외에는 다음 큐를 가리키도록
}
 
void Enqueue(Queue *pq, Data data)
{
    if (NextPosIdx(pq->rear) == pq->front// 큐가 꽉 찼다면,
    {
        printf("Queue Memory Eroor!"); // 여기 접근을 할 수 없는 코드인데 접근한다면 에러구문 표시 후 종료
        exit(-1); // 즉, 원형 큐에서는 전체크기 - 1을 기준으로 F,R이 만나지 않게되는 알고리즘인데 F==Q가 될 수 없다.
    }
 
    pq->rear = NextPosIdx(pq->rear); // rear을 한 칸 이동
    pq->queArr[pq->rear] = data; // rear이 가리키는 곳에 데이터 저장
}
 
Data Dequeue(Queue *pq)
{
    if (QIsEmpty(pq)) // 아무것도 없는 상태에서 큐에 있는 데이터를 뺀다는 것은 오류.
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    pq->front = NextPosIdx(pq->front); // front를 한 칸 이동한다
    return pq->queArr[pq->front];  // front가 가리키는 데이터를 반환한다.
}
 
Data QPeek(Queue *pq)           
{
    if (QIsEmpty(pq))
    {
        printf("Queue Memory Error!");
        exit(-1);
    }
 
    return pq->queArr[NextPosIdx(pq->front)];
}
 
 
 
Crocus




- CircularQueueMain.c -


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
#include <stdio.h>
#include "CircularQueue.h"
 
 
//#pragma warning (disable : 4996) // scanf_s 안쓰고 그냥 scanf 쓰기 위함
 
int main(void)
{
    //Queue의 생성 및 초기화
 
    Queue q;
    QueueInit(&q); // F,R의 위치를 0으로 초기화 시킨다.
 
                   // 데이터 넣기
    Enqueue(&q, 1);
    Enqueue(&q, 2);
    Enqueue(&q, 3);
    Enqueue(&q, 4);
    Enqueue(&q, 5);
    // 데이터 꺼내기
 
    while (!QIsEmpty(&q)) // 큐가 다 빠질때 까지(즉 큐가 텅비면 1, 남아있으면 0인데 !로 인해 텅비면 0, 남아있으면 1)
        printf("%d ", Dequeue(&q));
 
    while (1) {};
    return 0;
}
 
 
Crocus





















반응형