[큐]
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* queue, int 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 |