If at first you don't succeed, try again

[자료구조] Circular Queue(원형 큐)(Python) 본문

Computer Science/자료구조(Python)

[자료구조] Circular Queue(원형 큐)(Python)

웅지니어링 2022. 11. 7. 23:27

* 개요

Circular Queue(원형 큐)는 큐의 변형된 구조로서, 데이터를 넣는 부분(rear)과 데이터를 빼는 부분(front)을 포인터로 지정함으로써,enqueue와 dequeue를 하는 형태의 자료구조이다. 원형 큐에서 정해둔 큐의 크기보다 더 큰 경우(큐가 가득 찬 경우), 큐가 비어있을 경우에 포인터가 같은 위치를 지정하기 때문에 이를 해결하기 위해 한 공간을 비워놓는다.(None or Null)

 

* 파이썬으로 구현한 원형 큐

원형 큐를 리스트로 구현하였다.

MAX_SIZE = 5

class CircularQueue:
    def __init__(self):
        self.front = 0
        self.rear = 0
        self.queue = [None] * MAX_SIZE

    def enqueue(self, data):
        if self.isFull():
            print("원형 큐가 꽉 찼음.")

        else:
            self.rear = (self.rear + 1) % MAX_SIZE
            self.queue[self.rear] = data

    def dequeue(self):
        dequeue_data = None

        if self.isEmpty():
            print("원형 큐가 비어있음.")

        else:
            self.front = (self.front + 1) & MAX_SIZE
            dequeue_data = self.queue[self.front]

        return dequeue_data

    def clear(self) :
        self.front = self.rear
    
    def peek(self):
        peek_data = None

        if self.isEmpty():
            print("원형 큐가 비어있음.")

        else:
            peek_data = self.queue[(self.front + 1) % MAX_SIZE]

        return peek_data

    def isEmpty(self):
        is_empty = False

        if self.front == self.rear:
            is_empty = True

        return is_empty

    def isFull(self):
        is_full = False

        if self.front == (self.rear + 1) % MAX_SIZE:
            is_full = True

        return is_full

    def printQueue(self):
        if self.front < self.rear :
            print(self.queue[self.front + 1 : self.rear + 1])
                
        else :
            print(self.queue[self.front + 1 : MAX_SIZE] + self.queue[0 : self.rear + 1])

원형 큐의 크기(MAX_SIZE)를 5의 상수로 지정하였다.

__init__()은 원형 큐의 초기화 부분으로서 데이터를 추출하는 front, 데이터를 삽입하는 rear 부분을 모두 0으로 선언한다. 그 후, queue에 MAX_SIZE만큼 None을 대입하여 리스트를 선언한다.

enqueue()는 삽입 함수로, 원형 큐가 꽉 찼는지 여부를 확인하고, 큐가 가득 차지 않았다면

(rear의 인덱스 + 1)  % MAX_SIZE 연산한 것을 rear에 대입한다. 그 후 변경된 rear 인덱스에 데이터를 추가해주면 된다.

dequeue()는 삭제 함수로, 원형 큐가 비어있는지 여부를 확인하고, 큐가 비어있지 않다면

(front의 인덱스 + 1) % MAX_SIZE 연산한 것을 front에 대입한다. 그 후 변경된 front 인덱스의 데이터를 반환한다.

clear()는 큐를 초기화하는 함수로, front의 인덱스를 rear의 인덱스로 바꿔준다. 이렇게 된다면 front == rear가 성립이 되고, 원형 큐의 기존의 인덱스에 새로운 데이터를 삽입할 수 있게 된다.

peek()는 큐의 front 인덱스의 데이터를 반환하는 함수로, 인덱스 변경은 이루어지지 않는다.

isEmpty() 함수는 큐가 비어있는지의 여부를 확인하는 함수로, front와 rear가 같다면 비어있는 것으로 간주한다.

isFull()함수는 큐가 데이터로 꽉 차 있는지의 여부를 확인하는 함수이다. 만약 front의 인덱스와 (rear + 1) % MAX_SIZE가 같다면 가득 찬 것으로 간주한다.

printQueue() 함수는 큐의 데이터를 출력하는 함수이다. 만약 front의 인덱스가 rear의 인덱스보다 작다면, front + 1의 인덱스부터 rear의 인덱스까지의 데이터를 출력한다. 그러나 front의 인덱스가 rear의 인덱스보다 크거나 같다면(초기화하였을 경우(clear) 또는 데이터 삽입과 삭제가 전혀 이루어지지 않은 초기 상태의 경우(init)), front + 1의 인덱스부터 MAX_SIZE 이전의 데이터 + 큐의 0 인덱스부터 rear의 인덱스의 데이터까지 출력한다.