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())