[자료구조] Queue (feat. C 언어)
2023. 7. 19. 09:06ㆍCS/자료구조
정의
큐(Queue)는 자료 구조 중 선형 구조에 해당되며 먼저 삽입된 자료 순서대로 삭제되는 선입선출(FIFO : First In Fisrt Out) 방식으로 이루어져 있다. 자료를 삽입할 때는 enqueue라고 하며 반대로 삭제할 때는 dequeue라고 한다. 가장 먼저 삽입된 위치를 front, 가장 나중에 삽입된 위치를 rear라고 한다.
특징
- 선형 구조
- 선입선출(FIFO : First In Fisrt Out)
- 삽입 - enqueue, 삭제 - dequeue
- 가장 먼저 삽입 위치 - front, 가장 나중 삽입 위치 - rear
- 운영체제의 작업 스케줄링
연산
- enqueue 연산 : 큐가 비어있는 경우 추가되는 데이터가 front 및 rear가 된다. 큐에 데이터가 추가될 때 현 rear가 가리키는 포인터는 추가되는 노드의 주소가 되며 추가되는 노드가 가리키는 포인터는 null값을 가진다. 이후 추가 되는 노드가 rear가 된다.
- dequeue 연산 : 데이터 삭제 시 front가 가리키는 노드가 front가 되며 삭제 되는 노드는 free 함수를 통해 메모리를 해제한다.
구현
- init_queue 함수 : 큐 초기화
1
2
3
4
5
6
|
void init_queue(struct Queue* queue) // queue 이니셜라이징
{
queue->front = NULL;
queue->rear = NULL;
queue->count = 0;
}
|
cs |
- enqueue 함수 : 큐에 데이터 삽입
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
void enqueue(struct Queue* queue, int data) // data를 queue 넣어주는 함수
{
struct Node_queue* node = (struct Node_queue*)malloc(sizeof(struct Node_queue));
node->data = data;
if (queue->count == 0) // queue가 비어있는 경우
{
queue->front = node;
}
else
{
queue->rear->next = node; // dequeu 시 사라지는 node는 front이기 때문에 front 쪽에서 부터 연쇄되야함
}
queue->rear = node;
queue->count += 1;
}
|
cs |
- dequeue 함수 : 큐에서 데이터 삭제 후 데이터 값 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int dequeue(struct Queue* queue) // data를 queue에서 제거해주는 함수, data는 FIFO 형식(First In First Out) : 맨 처음에 들어온 data가 맨 첫번째로 제거 된다.
{
int data;
struct Node_queue* node = queue->front;
if (queue->count == 0) // queue가 비어있는 경우
{
printf("남은 data가 없습니다.\n");
return 0;
}
data = node->data;
queue->front = node->next;
queue->count -= 1;
free(node);
return data;
}
|
cs |
- 전체 구조
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
|
struct Node_queue {
int data;
struct Node_queue* next;
};
struct Queue {
struct Node_queue* front;
struct Node_queue* rear;
int count;
};
void init_queue(struct Queue* queue);
void enqueue(struct Queue* queue, int data);
int dequeue(struct Queue* queue);
void init_queue(struct Queue* queue) // queue 이니셜라이징
{
queue->front = NULL;
queue->rear = NULL;
queue->count = 0;
}
void enqueue(struct Queue* queue, int data) // data를 queue 넣어주는 함수
{
struct Node_queue* node = (struct Node_queue*)malloc(sizeof(struct Node_queue));
node->data = data;
if (queue->count == 0) // queue가 비어있는 경우
{
queue->front = node;
}
else
{
queue->rear->next = node; // dequeue 시 사라지는 node는 front이기 때문에 front 쪽에서 부터 연쇄되야함
}
queue->rear = node;
queue->count += 1;
}
int dequeue(struct Queue* queue) // data를 queue에서 제거해주는 함수, data는 FIFO 형식(First In First Out) : 맨 처음에 들어온 data가 맨 첫번째로 제거 된다.
{
int data;
struct Node_queue* node = queue->front;
if (queue->count == 0) // queue가 비어있는 경우
{
printf("남은 data가 없습니다.\n");
return 0;
}
data = node->data;
queue->front = node->next;
queue->count -= 1;
free(node);
return data;
}
|
cs |
'CS > 자료구조' 카테고리의 다른 글
[자료구조] Hash Table (해시 테이블) (0) | 2023.07.24 |
---|---|
[자료구조] 배열(Array) vs 연결 리스트(Linked List) (0) | 2023.07.20 |
[자료구조] Linked List (연결 리스트) (feat. C 언어) (0) | 2023.07.19 |
[자료구조] Queue - Josephus problem (feat. C 언어) (0) | 2023.07.19 |
[자료구조] Stack (feat. C 언어) (0) | 2023.07.19 |