말 그대로, 먼저 들어온 순서대로 먼저 나간다는 것을 뜻합니다. 음식점에서 줄을 서서 밥을 먹는 것을 생각해보면 됩니다. 줄을 서서, 가장 먼저 줄을 섰던 사람이 제일 먼저 식당을 입장하듯, 먼저 들어온 데이터 순서 그대로 먼저 데이터가 사용/출력된다는 것을 뜻합니다.
(https://www.fun-coding.org/00_Images/queue.png)
FIFO와 마찬가지로, 말 그대로 해석하면 됩니다. 늦게 들어온 데이터 일수록, 먼저 사용/출력된다는 뜻입니다. LIFO는 다음에 볼 스택(Stack)와 연관이 깊으므로, 스택에서 한번 더 다루도록 하겠습니다.
- Enqueue: 큐(Queue)에 데이터를 적재
- Dequeue: 큐(Queue)에서 데이터를 꺼내기
파이썬에서 큐를 구현하기 위해서는 queue 라이브러리를 사용해야합니다. 해당 라이브러리에서는 총 3가지의 큐를 제공합니다.
1. Queue(): 가장 일반적인 큐(FIFO)
2. LifoQueue(): LIFO 큐
3. PriorityQueue(): 큐에 적재되는 데이터마다 우선순위가 정해지고, 우선 순위에 따라서 데이터가 Dequeue 됩니다
(put() == Enqueue, get() == Dequeue)
import queue
data_queue = queue.Queue() # First - in - Frist - out
data_queue.put("funcoding") # 'funcoding' Enqueue
data_queue.put(1) # 1 Enqueue
print(data_queue.qsize()) # 큐의 크기 출력 -> 2
print(data_queue.get()) # Dequeue -> 'funcoding' 출력
print(data_queue.get()) # Dequeue -> 1 출력
1보다 'funcoding'이 먼저 큐에 적재되었으므로, Dequeue를 할때도 'funcoding'이 먼저 큐에서 나옵니다.
import queue
data_Lqueue = queue.LifoQueue() # Last - in - First - out
data_Lqueue.put("funcoding")
data_Lqueue.put(1)
print(data_Lqueue.get()) # Dequeue -> 1 출력
print(data_Lqueue.get()) # Dequeue -> 'funcoding' 출력
1보다 'funcoding'이 먼저 큐에 적재되었지만, LIFO이므로 Dequeue시 나중에 적재된 1이 먼저 큐에서 나오게 됩니다.
import queue
data_Pqueue = queue.PriorityQueue()
data_Pqueue.put((10, "korea")) # put((우선순위, 데이터)) -> 우선순위 숫자가 낮을 수록 우선순위가 높은 것; (우선순위, 데이터) -> 튜플
data_Pqueue.put((5, 1))
data_Pqueue.put((15, "china")) # 1, 'korea', 'china' 순서로 큐에 적재
print(data_Pqueue.get()) # Dequeue -> (5, 1) 출력
print(data_Pqueue.get()) # Dequeue -> (10, 'korea') 출력
print(data_Pqueue.get()) # Dequeue -> (15, 'china') 출력
PriorityQueue에서는 우선순위에 따라서 Dequeue 됩니다. 데이터를 적재할때 우선순위를 정해주는데, 이때 숫자가 낮을수록 우선순위는 높은것 입니다. 그러므로, Deuque시에는 1, 'korea', 'china' 순으로 큐에서 데이터가 나오게 됩니다.
def enqueue(data):
queue_list.append(data)
def dequeue():
data = queue_list[0]
del queue_list[0]
return data