ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Circular Buffer with Python
    Data 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())

     

    댓글

Designed by Tistory.