본문 바로가기

알고리즘

큐(Queue)

큐(Queue)

가장 먼저 넣은 데이터를 가장 먼저 꺼낼 수 있는 구조

예) 음식점에서 가장 먼저 줄을 선 사람이 제일 먼저 음식점에 입장하는 것과 동일 (줄을 서는 행위와 유사하다)

FIFOLILO 정책이다.

알아둘 용어

Enqueue : 큐에 데이터를 넣는 기능

Dequeue : 큐에서 데이터를 꺼내는 기능

큐가 많이 쓰이는곳

멀티 태스킹을 위한 프로세스 스케쥴링 방식을 구현하기 위해 많이 사용됨

LIFO Queue

Last In First Out으로 마지막에 들어간 데이터가 가장 앞에 있는 데이터가 된다. 그러므로 데이터를 꺼내 올 땐 가장 마지막 데이터 부터 꺼내올 수 있다. (스택과 같은 형태라고 생각하면 된다.)

import queue

# LIFO 기법
data_queue = queue.LifoQueue()

data_queue.put('first')
data_queue.put('second')

print(data_queue.qsize())
print(data_queue.get())  # LIFO라 마지막에 들어갔던 second가 먼저 나오는걸 알 수 있다.
print(data_queue.qsize())

Priority Queue

우선순위를 부여하여 데이터를 넣는 형태이다.

import queue

data_queue = queue.PriorityQueue()

data_queue.put((10, "a"))  # 우선순위, 데이터 튜플 형태로 이루어진다.
data_queue.put((2, "b"))  # 우선순위, 데이터 튜플 형태로 이루어진다.
data_queue.put((11, 'c'))

print(data_queue.qsize())
print(data_queue.get())
print(data_queue.get())
print(data_queue.get())

리스트 변수로 큐를 다루어보기 (enqueue, dequeue 기능 구현)

# 리스트 변수로 큐를 다루는 enqueue, dequeue 기능 구현

class Queue:
    """
    enqueue : 데이터 넣을때
    dequeue : 데이터 뺄때
    queue_size : 데이터 사이즈(길이) 체크
    empty : 데이터가 비었는지 확인 True/False
    queue_list : 데이터 리스트 확인
    """

    def __init__(self):
        self.queue_data = []

    def enqueue(self, data):
        self.queue_data.append(data)

    def dequeue(self):
        data = self.queue_data[0]
        del self.queue_data[0]
        return data

    def queue_size(self):
        return len(self.queue_data)

    def empty(self):
        if self.queue_size() == 0:
            return True
        return False

    def queue_list(self):
        return self.queue_data


if __name__ == '__main__':
    queue = Queue()
    print(f'큐 사이즈 : {queue.queue_size()}')
    queue.enqueue(1)
    queue.enqueue(2)
    queue.enqueue(3)
    queue.enqueue(4)
    print(f'큐 데이터 확인 : {queue.queue_list()}')
    print(f'큐 사이즈 : {queue.queue_size()}')
    print(f'큐에서 데이터 뺀거 : {queue.dequeue()}')
    print(f'큐에서 데이터 뺀거 : {queue.dequeue()}')
    print(f'큐 데이터 확인 : {queue.queue_list()}')
    print(f'큐 사이즈 : {queue.queue_size()}')

'알고리즘' 카테고리의 다른 글

링크드 리스트(Linked List) - 1  (0) 2021.07.16
스택(Stack)  (0) 2021.07.13
재귀함수  (0) 2021.06.29
삽입정렬 -스터디-  (0) 2021.06.25
선택정렬 -스터디-  (0) 2021.06.21