Animated Rainbow Nyan Cat
본문 바로가기
Algorithm study

Ch 05. 큐(Queue)

by SOBONA 2022. 3. 24.

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

- FIFO(First-In, First-Out) 또는 (Last-In, Last-Out) 방식이다.

- 스택과 꺼내는 순서가 반대

Queue의 용어

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

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

파이썬에서 queue 라이브러리를 지원해준다.

Queue(), LifoQueue(), PriorityQueue() 등 다양한 라이브러리 제공(프로그램에 따라 적합한 자료 구조를 사용하자)

- Queue(): 가장 일반적인 큐 자료 구조

- LifoQueue(): 나중에 입력된 데이터가 먼저 출력되는 구조 (스택 구조라고 보면 됨)

- PriorityQueue(): 데이터마다 우선순위를 넣어서, 우선순위가 높은 순으로 데이터 출력

Queue()

가장 일반적인 큐 자료 구조

import queue

#queue
data_queue = queue.Queue() # queue 생성

data_queue.put("funcoding") # enqueue
data_queue.put(1)  

data_queue.qsize() # queue의 길이를 알 수 있다.

data_queue.get() # 데이터를 뽑아낸다. 이후 qsize는 "funcoding" 원소가 뽑혀져, 1이다.

LifoQueue()

나중에 입력된 데이터가 먼저 출력되는 구조

import queue

# LifoQueue (스택 구조의 queue)
data_queue = queue.PriorityQueue()

data_queue.put("funcoding")
data_queue.put(1)

data_queue.get() #일반 queue와는 다르게 "funcoding"이 아니라 원소 1이 나온다.

PriorityQueue()

자료구조나 알고리즘에서도 잘 쓰인다.

import queue

#우선 순위가 매겨져 있다.
data_queue = queue.PriorityQueue()

data_queue.put((10, "korea")) #data를 tuple 값으로 넣어준다. 우선순위가 10번이고 실제 데이터 값은 "korea"
data_queue.put((5, 1))
data_queue.put((15, "china"))

data_queue.get() #우선순위가 가장 높은 1이 출력된다.

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

큐의 경우에는 장단점 보다는 (특별히 언급되는 장단점이 없다.), 큐의 활용 예로 프로세스 스케쥴링 방식을 함께 이해해두는 것이 좋음

 

리스트 변수로 큐 구현하기
queue_list = list()

def enqueue(data):
    queue_list.append(data)
    
def dequeue():
    data = queue_list[0]
    del queue_list[0]
    return data