Circular Queue
원형 큐(Circular Queue)
또는 환형 큐
또는 링버퍼(Ring Buffer)
라고 부른다.
- 큐와 마찬가지로 FIFO 구조를 지닌다는 점에서 기존의 큐와 동일
- Queue 자료구조의 특성상 한쪽 방향에선 데이터가 들어가고 한쪽 방향에서는 데이터가 나가면서 뒤에 남아있는 데이터들을 한 칸씩 모두 이동해야 하는 한계가 있는데 이를 극복하기 위해 리스트를 사용해 Circul Queue를 만들어 한계를 극복 가능합니다.
https://www.geeksforgeeks.org/circular-queue-set-1-introduction-array-implementation/
Python으로 Circular Queue 구현
class CircularQueue:
def __init__(self, k):
self.q = [None] * k
self.len = k
self.front = 0
self.rear = 0
def enQueue(self, value):
if self.q[self.rear] is None:
self.q[self.rear] = value
self.rear = (self.rear + 1) % self.len
return True
else:
return False
def deQueue(self):
if self.q[self.front] is not None:
result = self.q[self.front]
self.q[self.front] = None
self.front = (self.front + 1) % self.len
return result
else:
return False
def pr_front(self):
return False if self.q[self.front] is None else self.q[self.front]
def pr_rear(self):
return False if self.q[self.rear] is None else self.q[self.rear]
def is_empty(self):
return self.q[self.front] == None and self.q[self.rear] == None
def is_full(self):
return None not in self.q
queue = CircularQueue(3)
queue.enQueue(1)
queue.enQueue(2)
queue.enQueue(3)
print(queue.deQueue())
print(queue.deQueue())
print(queue.deQueue())
print(queue.is_empty())
print(queue.is_full())
- 큐에는 원래 pr_rear()연산이 없지만 두개의 포인터를 사용해서 (self.front, self.rear) 연산을 할 수 있엇다.