Queue ADT, 큐 추상자료형
- 큐는 FIFO(First In, First Out), 선입선출 구조이다. 먼저 들어온 원소가 먼저 나간다.
- 원소의 삽입은 큐의 뒤에서 이루어지고, 원소의 삭제는 큐의 앞에서 이루어진다.
- 큐의 주요 기능은 다음과 같다.
- enqueue(obj) : 큐의 뒤(rear)에 원소를 삽입한다.
- dequeue(obj) : 큐의 앞(front)에 있는 원소를 꺼낸다.
- 큐의 추가적인 기능은 다음과 같다.
- front/top : 꺼내지 않고 큐의 맨 앞의 원소를 확인한다.
- size : 큐에 저장된 원소의 수를 return한다.
- empty : 큐가 비어있는지 확인한다.
- 예외처리는 QueueEmpty로 큐가 빈 상태인지 확인한다.
- 큐의 구현으로는 배열 혹은 링크드 리스트를 사용할 수 있다.
큐 구현 - 배열기반
- 배열 기반 큐는 사이즈가 N인 원형 형태로 사용한다.
- 이 때 세 개의 변수가 맨 앞(front)와 뒤(rear)를 고려한다.
- f : 맨 앞에 있는 원소의 인덱스
- r : 맨 뒤에 있는 원소의 그 다음번 째 인덱스 (구현 방법에 따라 맨 뒤에 있는 원소가 될 수도 있다.)
- n : 큐에서의 원소의 개수
이 때 이 형태를 유지하기 위해 인덱스를 나타내는 변수 i와 배열의 크기 N이 있을 때,
i Mod N 의 식을 이용해서 배열에 접근한다.
Enqueue
- Q[r]에 삽입
- r = (r + 1) Mod N
- n = n + 1
※ enqueue는 O(1) 시간이 소모된다.
Dnqueue
- Q[f]에서 원소를 꺼낸다.
- f = (f + 1) Mod N
- n = n - 1
※ dnqueue는 O(1) 시간이 소모된다.
큐 구현 - 단일 링크드 리스트 기반
- 단일 링크드 리스트에서는 맨 앞에 노드를 head노드라고 했고, 맨 뒤 노드를 tail이라고 했다.
- 따라서 큐를 단일 링크드 리스트로 구현하려면 다음과 같이 해야한다.
- front : 큐에서 삭제가 일어나는 곳. 따라서 삽입, 삭제가 모두 빠른 head 노드로 정한다.
- rear : 큐에서 삽입이 일어나는 곳. 따라서 삽입만 빠른 tail 노드로 정한다.
성능
- 삽입, 삭제가 O(1) 시간이 소요된다.
- 공간은 O(n)만큼 차지한다.
'CS > 자료구조' 카테고리의 다른 글
List, Set, Map 각각의 특성 (1) | 2022.05.23 |
---|---|
[자료구조]2. 스택 (0) | 2021.07.19 |
[자료구조]1. 단일 링크드 리스트, 단일 연결 리스트 (0) | 2021.07.14 |