-
Circular Buffer with PythonData Structure & Algorithm 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())
'Data Structure & Algorithm' 카테고리의 다른 글
파라메트릭 탐색(Parametric search) (0) 2021.09.06 [프로그래머스] 프린터 (0) 2021.09.05 2차원 리스트 테두리만 회전 시키기 (0) 2021.08.30 소수판별 알고리즘 (0) 2021.08.16 1부터 순서대로 값을 채운 N * N 2차원 리스트 (0) 2021.08.15