[자료구조] 원형 큐(Circular Queue) 개념
by mini_min원형 큐 개념
👍🏻 원형 큐는 선형 큐와 마찬가지로 선입선출 형태의 데이터 구조이다. 선형 큐의 한계점을 해결하기 위해 구조화한 것으로, 배열의 마지막 인덱스에서 다음 인덱스로 넘어갈 때, (rear+1) % 배열 사이즈 공식으로 OutOfBoundException 이 일어나지 않고 인덱스 0으로 순환하는 구조를 가진다.
선형 큐의 문제점
선형 큐는 데이터 삽입/삭제 시 메모리 낭비가 발생한다. 선형 큐의 인덱스는 항상 배열의 마지막 인덱스를 가리키고 있기 때문에, 앞쪽에서 dequeue 로 빈 공간이 발생하고 이를 활용할 수가 없다. 그렇다고 매번 빈 공간이 없도록 데이터를 앞당길 수도 없고...
원형 큐의 등장
선형 큐는 데이터를 가리키는 인덱스가 하나였지만, 원형 큐는 front, rear 로 두 개의 인덱스 변수가 존재한다.
✨ 원형 큐는 포인터 증가 방식이 (rear+1)%array size 형식으로 변환하기 때문에 배열의 첫번째 인덱스부터 다시 삽입하여 재활용이 가능해진다.
원형 큐 - 삽입
rear 포인터를 +1 증가 시키고 그 위치에 데이터를 삽입한다.
만약 rear+1 이 배열의 끝이고 포화상태가 아니라면 첫번째 인덱스에 데이터를 넣는다.
* 배열의 포화상태 여부를 판단하기 위해 배열의 1칸은 비워둔다.
✔ (rear+1)%array size == front 값과 동일하다면 배열이 포화상태인 것으로, 데이터를 삽입하지 않는다.
원형 큐 - 제거
front +1 증가시키고 그 위치의 데이터를 배열에서 가지고 온다.
✔ rear==front 조건이라면 배열이 공백인 것으로 판단해 제거하지 않고 넘어간다.
💬 쉽게 정리하기
데이터를 추가하면 rear 값은 증가하고,
데이터를 제거하면 front 가 가리키던 곳의 데이터를 제거하고 front 값이 증가한다.
예제
ex ) 사이즈 4 짜리 원형 큐
1. rear = 0 / front = 0
-> dequeue 불가. (rear == front)
2. enqueue
(rear+1)%arrsize = 1%4==1 (!=front)
rear = 1 / front = 0 증가.
3. enqueue
(rear+1)%arrsize = 2%4==2 (!=front) enqueue 가능.
rear = 2 / front = 0 증가.
4. enqueue
(rear+1)%arrsize = 3%4==3 (!=front) enqueue 가능.
rear = 3 / front = 0 증가.
5. dequeue
front != rear 즉,
(front+1)%4 한 인덱스에 있는 배열 가져오기. ==1
rear = 3 / front = 1
6. dequeue
front != rear 즉
(front+1)%arrsize ==2 에 있는거 빼기
rear = 3/ front = 2
7. enqueue
(rear+1)%arrsize = 4%4==0(!=front) enqueue 가능.
rear = 0 (0위치에 데이터 넣기.) / front = 0
✔ 필요한 class 함수
- isEmpty() : 원형 큐가 비어있는지 체크
- isFull() : 원형 큐가 가득 찼는지 체크
- enqueue() : 원형 큐에 데이터 삽입
- dequeue() : 원형 큐에 데이터 삭제
- peek() : 원형 큐에서 front+1 위치에 있는 데이터 반환
- clear() : 원형 큐를 초기화
'매일매일 알고리즘 공부 > 알고리즘 개념' 카테고리의 다른 글
[알고리즘] DP(Dynamic Programming) 이란? (DP 알고리즘) (0) | 2023.11.17 |
---|---|
[자료구조-스택] 후위 표기법이란? (백준 1935번) (0) | 2023.11.08 |
[알고리즘] 좌표 압축 개념 (대소 관계로 정렬) (1) | 2023.10.16 |
[알고리즘] 에라토스테네스의 체 란? (Prime 소수 구하기) (0) | 2023.09.22 |
[알고리즘] 유클리드 호제법 (GCD) (0) | 2023.08.29 |
블로그의 정보
개발자 미니민의 개발로그
mini_min