본문 바로가기
프로그래밍/C 언어(정리)

C언어] 큐

by 곰나나 2024. 1. 2.

[큐]

1. 큐(Queue) 란?
큐(Queue)는 데이터를 선입선출(FIFO - First-In-First-Out)의 순서로 저장하는 자료구조이다.

큐는 주로 데이터를 임시로 저장하고 순서대로 처리해야 할 때 사용됩니다. C 언어에서 큐를 구현하기 위해서는 배열이나 연결 리스트 등을 활용할 수 있다.

큐는 주로 두 가지 주요 연산을 지원합니다:
enqueue: 큐의 뒤쪽에 새로운 요소를 추가합니다.
dequeue: 큐의 앞쪽에서 요소를 제거하고 반환합니다.

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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <stdio.h>
#include <stdlib.h>
 
#define MAX_SIZE 5
 
//& 큐 구조체 정의
typedef struct {
    int data[MAX_SIZE];
    int front, rear;
} Queue;
 
//& 큐 초기화 함수
void initializeQueue(Queue* queue)
{
    queue->front = -1;
    queue->rear = -1;
}
 
//& 큐가 비어있는지 확인하는 함수
int isEmpty(Queue* queue)
{
    return (queue->front == -1 && queue->rear == -1);
}
 
//& 큐이 가득 찼는지 확인하는 함수
int isFull(Queue* queue)
{
    return ((queue->rear + 1) % MAX_SIZE == queue->front);
}
 
//& 큐에 데이터를 추가하는 함수 (enqueue)
void enqueue(Queue* queueint value)
{
    if (isFull(queue))
    {
        printf("큐가 가득 찼습니다. Enqueue할 수 없습니다.\n");
        return;
    }
 
    if (isEmpty(queue))
    {
        //& 큐가 비어있는 경우 front와 rear를 초기화
        queue->front = 0;
        queue->rear = 0;
    }
    else
    {
        //& rear를 다음 위치로 이동 (원형 큐의 구현)
        queue->rear = (queue->rear + 1) % MAX_SIZE;
    }
 
    //& 데이터를 큐에 추가
    queue->data[queue->rear] = value;
}
 
//& 큐에서 데이터를 제거하고 반환하는 함수 (dequeue)
int dequeue(Queue* queue)
{
    int value;
 
    if (isEmpty(queue))
    {
        printf("큐가 비어있습니다. Dequeue할 수 없습니다.\n");
        return -1//& 임의의 값 반환, 실제로는 에러 처리를 해야 할 수도 있습니다.
    }
 
    //& front에 있는 데이터를 추출
    value = queue->data[queue->front];
 
    if (queue->front == queue->rear)
    {
        //& 큐에 하나의 원소만 남아있는 경우 큐 초기화
        initializeQueue(queue);
    }
    else
    {
        //& front를 다음 위치로 이동 (원형 큐의 구현)
        queue->front = (queue->front + 1) % MAX_SIZE;
    }
 
    return value;
}
 
//& 큐의 front에 있는 데이터를 반환하는 함수 (peek)
int peek(Queue* queue)
{
    if (isEmpty(queue))
    {
        printf("큐가 비어있습니다. Peek할 수 없습니다.\n");
        return -1//& 임의의 값 반환, 실제로는 에러 처리를 해야 할 수도 있습니다.
    }
 
    //& front에 있는 데이터를 반환
    return queue->data[queue->front];
}
 
//& 큐의 모든 데이터를 출력하는 함수
void displayQueue(Queue* queue)
{
    int i, count;
 
    if (isEmpty(queue))
    {
        printf("큐가 비어있습니다.\n");
        return;
    }
 
    printf("큐: ");
    //& front부터 rear까지 데이터 출력 (원형 큐의 구현)
    count = (queue->rear + MAX_SIZE - queue->front) % MAX_SIZE + 1;
    for (i = 0; i < count; i++)
    {
        printf("%d "queue->data[(queue->front + i) % MAX_SIZE]);
    }
    printf("\n");
}
 
int main()
{
    Queue myQueue;
    initializeQueue(&myQueue);
 
    enqueue(&myQueue, 10);
    enqueue(&myQueue, 20);
    enqueue(&myQueue, 30);
 
    displayQueue(&myQueue);
 
    printf("Front element: %d\n", peek(&myQueue));
 
    dequeue(&myQueue);
 
    displayQueue(&myQueue);
 
    return 0;
}// main
cs

 

정수형 큐를 배열을 이용하여 구현. 크기가 제한된 큐이기 때문에 원형 큐(circular queue)의 개념을 도입하여 배열의 끝에 도달하면 다시 처음으로 돌아가도록 구현 했다. 큐에 값을 추가하고(enqueue), 제거하고(dequeue), 확인하고(peek), 표시(display)하는 함수들이 포함되어 있다.

728x90

'프로그래밍 > C 언어(정리)' 카테고리의 다른 글

C언어] 검색-선형검색  (0) 2024.01.02
C언어] 트리  (0) 2024.01.02
C언어] 스택  (0) 2024.01.01
C언어] 이중 연결 리스트  (1) 2024.01.01
C언어] 단순 연결 리스트  (0) 2023.12.30