Data Structure & Algorithm
Circular Buffer with Python
낙타선생
2021. 9. 4. 11:10
반응형
circular buffer의 데이터를 저장할 공간을 list를 사용하여 확보한다.
데이터의 시작점(front)와 끝점(rear)을 각각 0으로 설정한다.
데이터가 삽입될 때는 rear에 1을 더해주고 rear % 저장공간의_길이에 해당하는 인덱스에 저장한다.
데이터를 삭제할 때는 front에 1을 더해주고 front % 저장공간의_길이 에 해당하는 인덱스의 값을 되돌려준다.
front == rear 이면 circular buffer가 비어있는 것이다.
front == (rear + 1) % 저장공간의_길이 이면 circular buffer가 가득 찬 것이다.
class CircularBuffer:
def __init__(self, k: int):
self.q_len = k + 1
self.front = 0
self.rear = 0
self.c_buffer = [0] * self.q_len
def insert(self, value: int) -> bool:
# circular buffer is full
if self.is_full():
raise Exception('circular buffer is full')
else:
self.rear = (self.rear + 1) % self.q_len
self.c_buffer[self.rear] = value
return True
def delete(self) -> bool:
if self.is_empty():
raise Exception('circular buffer is empty')
self.front = (self.front + 1) % self.q_len
return self.c_buffer[self.front]
def get_front(self) -> int:
if self.is_empty():
return None
return self.c_buffer[(self.front + 1) % self.q_len]
def get_rear(self) -> int:
if self.is_empty():
return None
return self.c_buffer[self.rear]
def is_empty(self) -> bool:
return True if self.front == self.rear else False
def is_full(self) -> bool:
next_idx = (self.rear + 1) % self.q_len
return True if next_idx == self.front else False
myCircularBuffer = CircularBuffer(3)
myCircularBuffer.insert(1)
myCircularBuffer.insert(2)
myCircularBuffer.insert(3)
print(myCircularBuffer.is_empty())
# myCircularBuffer.insert(4)
print(myCircularBuffer.delete())
print(myCircularBuffer.delete())
print(myCircularBuffer.delete())
print(myCircularBuffer.is_full())
# print(myCircularBuffer.delete())