자료구조_c언어_서클 큐_circleQueue_01

2021. 2. 10. 11:11개발하는중/자료구조

728x90
반응형
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <stdio.h>
#include <stdlib.h>
#define cQ_SIZE 4
 
typedef char element;    // char형을 queue element의 자료형으로 정의
typedef struct {
    element queue[cQ_SIZE];
    int front, rear;
}cQueueType;
 
cQueueType *createQueue() {
    cQueueType *cQ;
    cQ = (cQueueType *)malloc(sizeof(cQueueType));
 
    cQ->front = 0;
    cQ->rear = 0;
 
    return cQ;
}
 
int isEmpty(cQueueType *cQ) {
    if (cQ->front == cQ->rear) {
        printf("\n Circular Queue is empty! \n");
        return 1;
    }
    else
    {
        return 0;
    }
}
 
int isFull(cQueueType *cQ)
{
    if (((cQ->rear + 1) % cQ_SIZE) == cQ->front)
    {
        printf("\n Circular Queue is full! \n");
        return 1;
    }
    else
    {
        return 0;
    }
}
 
 
void enQueue(cQueueType *cQ, element item) {
    if (isFull(cQ)) {
        exit(1);
    }
    else {
        cQ->rear = (cQ->rear+1) % cQ_SIZE;    // rear+1에 cQ_SIZE 나머지를 rear에 준다.
        cQ->queue[cQ->rear] = item;
    }
}
 
element deQueue(cQueueType *cQ) {
    if (isEmpty(cQ)) {
        exit(1);
    }
    else
    {
        cQ->front = (cQ->front + 1) % cQ_SIZE;
        return cQ->queue[cQ->front];
    }
}
 
void del(cQueueType *cQ) {
    if (isEmpty(cQ)) {
        exit(1);
    }
    else
    {
        cQ->front = (cQ->front + 1) % cQ_SIZE;
    }
}
 
element peek(cQueueType *cQ) {
    if (isEmpty(cQ)) {
        exit(1);
    }
    else
    {
        return cQ->queue[(cQ->front + 1) % cQ_SIZE];
    }
}
 
void printQ(cQueueType *cQ)
{
    int i, first, last;
 
    first = (cQ->front + 1) % cQ_SIZE;    // 1. cQ가 가르키는 front에 +1 하고 나머지 연산자로 결과값 first넣어줌
    last = (cQ->rear + 1) % cQ_SIZE;    // 2. 동일하게 last에 넣어줌
 
    printf("\n Circular Queue : [");
    i = first;                            // 3. i에 1번first 넣어줌
    while (i != last)                    // 4. i==first 이므로 i가 last와 같을때까지 실행
    {
        printf("%3c", cQ->queue[i]);
        i = (i + 1) % cQ_SIZE;
    }
    printf("]");
}
 
void main(void)
{
    cQueueType *cQ1 = createQueue();
    element data;
 
    enQueue(cQ1, 'A');    printQ(cQ1);
    enQueue(cQ1, 'B');    printQ(cQ1);
    deQueue(cQ1);     printQ(cQ1);
    enQueue(cQ1, 'C');    printQ(cQ1);
    data = peek(cQ1);    printf("\n peek item: %c", data);
    deQueue(cQ1);    printQ(cQ1);
    deQueue(cQ1);    printQ(cQ1);
 
    getchar();
 
}
cs
728x90