큐
먼저 집어 넣은 데이터가 먼저 나오는 FIFO ( First In First Out ) 구조로 저장되는 형식을 말합니다.
프린터의 출력, 키보드 입력 등 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에서 사용됩니다.
큐는 Put ( 삽입 ), Get ( 삭제 ) 를 이용하여 구현됩니다.
Put 은 큐에 자료를 넣는 것을, Get 은 큐에서 자료를 꺼내는 것을 의미합니다.
Front 와 Rear 은 데이터의 위치를 가르키며, Front 는 데이터를 Get 할 수 있는 위치, Rear 는 데이터를 Put 할 수 있는 위치를 의미합니다.
큐가 가득차서 자료를 더이상 넣을 수 없는 경우를 오버플로우, 큐가 비어있어 자료를 꺼낼수 없는 경우를 언더플로우라고 합니다.
큐의 종류 및 작동방식
선형과 환형이 있습니다.
선형의 개념 및 작동방식
막대 모양으로 된 큐 입니다. 크기가 제한되어 있고 빈 공간을 사용하려면 모든 자료를 꺼내거나 한 칸씩 옮겨야 한다는 단점이 있습니다.
ENQ 는 enque 의 약자로 Put 을 , DEQ 는 deque 의 약자로 Get 을 의미합니다.
1. A 가 삽입(Put)됩니다.
2. B 가 삽입(Put)됩니다.
3. C 가 삽입(Put)됩니다.
4. A 가 삭제(Get)됩니다.
5. D 가 삽입(Put)됩니다.
6. D 가 큐의 끝에 도달하였으므로 E 는 큐에 삽입되지 못합니다.
7. B 가 삭제(Get)됩니다.
환형의 개념 및 작동방식
선형 큐의 문제점을 보완항 방식입니다.
Front 가 큐의 끝에 닿으면 큐의 맨 앞으로 자료를 보내서 원형으로 연결하는 방식입니다. 원형 큐라고도 칭합니다.
1. A 가 삽입(Put)됩니다.
2. B 가 삽입(Put)됩니다.
3. C 가 삽입(Put)됩니다.
4. D 가 삽입(Put)됩니다.
5. A 가 삭제(Get)됩니다.
6. D 가 큐의 끝에 도달하였으므로 E 를 큐의 맨 앞으로 보내 빈 공간이 있는 경우 삽입(Put)합니다.
링크드 큐
연결 리스트를 사용하여 만든 큐로, 큐의 길이를 쉽게 늘릴 수 있어 오버플로우가 발생하지 않습니다.
환형 큐 방식으로 만들지 않아도 삽입과 삭제가 제한되지 않아 편리합니다.
배열로 구현한 환형 큐 소스
#include <stdio.h>
#define MAXSIZE 10
int queue[MAXSIZE];
int front, rear;
void put(int val) {
if ((rear+1) % MAXSIZE == front) {
printf ("Queue Overflow.");
}
queue[rear] = val;
rear = ++ rear % MAXSIZE;
}
int get (void) {
int ret;
if (front == rear) {
printf ("Queue Underflow.");
return -1;
}
ret = queue[front];
front = ++front%MAXSIZE;
return ret;
}
void main(void)
{
int i;
int j;
int k;
front = 0;
rear = 0;
put(5);
put(4);
i = get();
j = get();
put(7);
printf("%d, %d\n", i, j);
for( k = front; k != rear; k = ++k%MAXSIZE)
printf("%d, ", queue[k]);
}'Computer Language > C' 카테고리의 다른 글
| [C] 포인터란 무엇인가? (0) | 2018.11.16 |
|---|---|
| [C] 스택 개념, 함수, 코드 정리 (0) | 2018.11.08 |
| [C] 삽입정렬 개념, 알고리즘, 코드 정리 (0) | 2018.11.06 |
| [C] 선택정렬 개념, 알고리즘, 코드 정리 (0) | 2018.11.06 |
| [C] 버블정렬 개념, 알고리즘, 코드 정리 (0) | 2018.11.06 |