파이썬 Queue: FIFO & LIFO 이해와 실전 예제
파이썬 Queue: FIFO & LIFO 이해와 실전 예제
파이썬에서 큐(Queue)란?
큐는 선형 순서로 항목을 저장하는 자료구조입니다. 항목은 뒤쪽(rear)에서 추가되고 앞쪽(front)에서 제거되며, 선입선출(FIFO, First-In First-Out) 원칙을 따릅니다. 큐는 논리적 양끝인 front와 rear를 노출하며, enqueue는 뒤쪽에서, dequeue는 앞쪽에서 수행합니다.
이 튜토리얼에서 배울 내용:
- 파이썬
queue 모듈 작동 원리
- 파이썬에서 사용 가능한 큐 종류
- 모듈 설치 및 임포트 방법
Queue와 LifoQueue 객체의 주요 메서드
- FIFO와 LIFO 큐 실전 예제
- 일괄 연산, 정렬, 큐 뒤집기
큐 모듈 작동 원리
물리적 줄서기와 유사: 줄 선 첫 사람이 먼저 서비스받음. 큐 자료구조에서 먼저 enqueue된 요소가 먼저 dequeue됩니다.

rear는 새 항목 삽입 지점(예: 값 7). front는 항목이 나가는 지점; 첫 항목 제거 시 값 1 반환.
큐는 선형이므로 중간의 임의 요소를 바로 제거할 수 없으며, 앞서 있는 모든 요소를 dequeue해야 합니다.

파이썬의 큐 종류
파이썬 queue 모듈은 두 가지 주요 큐 클래스 제공:
- FIFO 큐 –
Queue() 사용. 가장 오래된 항목이 항상 먼저 제거.
- LIFO 큐 –
LifoQueue() 사용. 가장 최근 추가된 항목이 먼저 반환.
시작하기: 모듈 임포트
파이썬에 queue 모듈이 기본 탑재되어 외부 설치 불필요.
import queue
FIFO 큐 인스턴스화:
q1 = queue.Queue()
LIFO 큐 인스턴스화:
q1 = queue.LifoQueue()
주요 메서드
Queue와 LifoQueue는 같은 핵심 API 노출:
put(item) – 항목 enqueue.
get() – 다음 항목 dequeue 및 반환.
empty() – 큐가 비어 있으면 True 반환.
full() – 큐가 최대 크기에 도달하면 True 반환.
qsize() – 현재 항목 수 반환.
FIFO 큐 예제
단일 항목 Enqueue
import queue
q1 = queue.Queue()
q1.put(10) # 큐에 10 추가
크기 제한으로 다중 항목 Enqueue
q1 = queue.Queue(maxsize=5) # 최대 5개
for i in range(1, 6):
q1.put(i)
print(q1.full()) # → True
출력: True
항목 Dequeue
item = q1.get()
print('Dequeued item:', item)
출력: Dequeued item: 10
LIFO 큐 예제
단일 항목 Enqueue
q1 = queue.LifoQueue()
q1.put(10)
항목 Dequeue
item = q1.get()
print('LIFO Dequeued:', item)
출력: Dequeued from LIFO: 10
일괄 연산
FIFO – 20개 숫자 Enqueue
q1 = queue.Queue()
for i in range(20):
q1.put(i)
FIFO – 모두 Dequeue
while not q1.empty():
print('Value:', q1.get())
출력: Value: 0 ... Value: 19
LIFO – 20개 숫자 Enqueue
q1 = queue.LifoQueue()
for i in range(20):
q1.put(i)
LIFO – 모두 Dequeue
while not q1.empty():
print('Value:', q1.get())
출력: Value: 19 ... Value: 0
큐 정렬 (버블 정렬)
q1 = queue.Queue()
for item in [11, 5, 4, 21, 3, 10]:
q1.put(item)
n = q1.qsize()
for i in range(n):
x = q1.get()
for j in range(n-1):
y = q1.get()
if x > y:
q1.put(y)
else:
q1.put(x)
x = y
q1.put(x)
while not q1.empty():
print(q1.queue[0], end=' ')
q1.get()
출력: 3 4 5 10 11 21
재귀로 큐 뒤집기
def reverse_queue(src, dest):
item = src.get()
if not src.empty():
reverse_queue(src, dest)
dest.put(item)
return dest
q1 = queue.Queue()
for item in [11, 5, 4, 21, 3, 10]:
q1.put(item)
q2 = queue.Queue()
reverse_queue(q1, q2)
while not q2.empty():
print(q2.queue[0], end=' ')
q2.get()
출력: 10 3 21 4 5 11
빠른 요약
- 파이썬
queue.Queue는 FIFO, queue.LifoQueue는 LIFO 구현.
put()으로 enqueue, get()으로 dequeue.
- 두 클래스 모두
empty(), full(), qsize()로 상태 검사.
- FIFO 큐에 최대 크기 설정 가능; 공간 확보될 때까지
put() 블로킹.
- 정렬과 뒤집기는 표준 알고리즘으로 가능하지만,
collections의 deque가 더 유연한 경우가 많음.