728x90

질풍노도였던 21세 시절을 지나고 22살 이후 나에게 큐란 이 남성밖에 없었다.
큐 (Queue)
- 큐
- 선형큐
- 큐의 활용
Queue
큐(Queue)의 특성
- 스택과 마찬가지로 삽입과 삭제의 위치가 제한적인 자료구조
- 큐의 뒤에서는 삽입만 하고, 큐의 앞에서는 삭제만 이루어지는 구조
- 선입선출구조 (FIFO: First In First Out)
- 큐에 삽입한 순서대로 원소가 저장되어, 가장 먼저 삽입 (First In) 된 원소는 가장 먼저 삭제 (First Out) 된다

큐의 구조 및 기본 연산
큐의 선입선출 구조

큐의 기본 연산
- 삽입: enQueue
- 삭제: deQueue
연산 | 기능 |
---|---|
enQueue(item) | 큐의 뒤쪽(rear 다음)에 원소를 삽입하는 연산 |
deQueue() | 큐의 앞쪽(front)에서 원소를 삭제하고 반환하는 연산 |
createQueue() | 공백 상태의 큐를 생성하는 연산 |
isEmpty() | 큐가 공백 상태인지를 확인하는 연산 |
isFull() | 큐가 포화 상태인지를 확인하는 연산 |
Qpeek() | 큐의 앞쪽(front)에서 원소를 삭제 없이 반환하는 연산 |
큐의 연산 과정
1) 공백 큐 생성: createQueue();

2) 원소 A 삽입: enQueue(A);

3) 원소 B 삽입: enQueue(B);

4) 원소 반환/삭제: deQueue();

5) 원소 C 삽입: enQueue(C);

6) 원소 반환/삭제: deQueue();

7) 원소 반환/삭제: deQueue();

선형 큐 (Linear Queue)
큐의 구현
선형 큐
- 1차원 배열을 이용한 큐
- 큐의 크기 = 배열의 크기
- front: 마지막으로 삭제된 인덱스
- rear: 저장된 마지막 원소의 인덱스
- 상태 표현
- 초기 상태: front = rear = -1
- 공백 상태: front = rear
- 포화 상태: rear = n-1 (n: 배열의 크기, n-1: 배열의 마지막 인덱스)
초기 공백 큐 생성
- 크기 n인 1차원 배열 생성
- front와 rear를 -1로 초기화
삽입: enQueue(item)
- 마지막 원소 뒤에 새로운 원소를 삽입하기 위해2) 그 인덱스에 해당하는 배열 원소 Q[rear]에 item을 저장
enQueue(item) { if (isFull()) print("Queue_Full") else { rear = rear+1; Q[rear] = item; } }
- 1) rear 값을 하나 증가시켜 새로운 원소를 삽입할 자리를 마련
삭제: deQueue()
- 가장 앞에 있는 원소를 삭제하기 위해2) 새로운 첫 번째 원소를 리턴 함으로써 삭제와 동일한 기능을 함
deQueue() { if (isEmpty()) print("Queue_Empty") else { front = front+1; return Q[front]; } }
- 1) front 값을 하나 증가시켜 큐에 남아 있는 첫 번째 원소로 이동
공백 상태 및 포화 상태 검사: isEmpty()
, isFull()
- 공백 상태: front=rear
- 포화 상태: rear=n-1 (n: 배열의 크기, n-1: 배열의 마지막 인덱스)
isEmpty() { if (front == rear) return true; else return false; } isFull() { if (rear=n-1) return true; else return false; }
검색: Qpeek()
- 가장 앞에 있는 원소를 검색하여 반환하는 연산
- 현재 front의 한자리 뒤 (front+1)에 있는 원소, 즉 큐의 첫 번째에 있는 원소를 반환
Qpeek() { if (isEmpty()) print("Queue_Empty"); else return Q[front+1]; }
선형 큐 이용시의 문제점
잘못된 포화 상태 인식
- 선형 큐를 이용하여 원소의 삽입과 삭제를 계속할 경우, 배열의 앞부분에 활용할 수 있는 공간이 있음에도 불구하고, rear=n-1 인 상태 즉, 포화상태로 인식하여 더 이상의 삽입을 수행하지 않게 됨

해결방법 1
- 매 연산이 이루어질 때마다 저장된 원소들을 배열의 앞부분으로 모두 이동시킴
- 원소 이동에 많은 시간이 소요되어 큐의 효율성이 급격히 떨어짐

해결방법 2
- 1차원 배열을 사용하되, 논리적으로는 배열의 처음과 끝이 연결되어 원형 형태의 큐를 이룬다고 가정하고 사용
- 원형 큐의 논리적 구조

다음 글에서는 원형 큐를 만나보자!
728x90
'자료구조' 카테고리의 다른 글
자료구조 LinkedList - 정의, Singly Linked List, Double Linked List (0) | 2023.09.23 |
---|---|
자료구조 Queue - 원형 큐, 우선순위 큐 (0) | 2023.09.11 |
자료구조 Stack - 정의, 특성, 구현 (0) | 2023.09.06 |
자료구조 Array - 이차원 배열 (0) | 2023.08.26 |
자료구조 Array - 검색, 선택 정렬, 카운팅 정렬 (0) | 2023.08.24 |