1. 큐의 구조
- FIFO(First-In, First-Out): 먼저 넣은 데이터를 먼저 꺼낼 수 있는 구조
- 한쪽 끝에서 요소가 추가되고 다른쪽 끝에서 요소가 제거되는 선형 데이터 구조
- 참고 사이트: https://visualgo.net/en/list
1-1. 큐의 용어
- Enqueue: 데이터를 큐에 넣는 기능
- Dequeue: 데이터를 큐에서 꺼내는 기능
1-2. 큐의 사용
- 어떠한 작업/데이터를 순차적으로 실행/사용하기 위해 대기 시킬 때 사용
- 멀티테스킹을 위한 프로세스 스케줄링 방식을 구현(운영체제)
1-3. 파이썬 queue 라이브러리를 활용하여 queue 자료구조 사용
- Queue(): 가장 일반적인 큐 자료구조
- LifoQueue(): 나중에 입력된 데이터가 먼저 출력(LIFO)되는 구조의 큐 자료구조로 스택 구조와 유사
- PriorityQueue(): 데이터마다 우선 순위를 넣어서 우선 순위가 높은 순으로 데이터를 출력
import queue
# Queue()로 큐 만들기
data_queue = queue.Queue()
data_queue.put('Hello') # Enqueue
data_queue.put('Python')
data_queue.put('Hello')
data_queue.put('World')
print(data_queue)
print(data_queue.qsize())
print(data_queue.get()) # Dequeue
print(data_queue.qsize())
for i in range(data_queue.qsize()):
print(data_queue.get())
# LifoQueue()로 큐 만들기
data_queue = queue.LifoQueue()
data_queue.put('Hello')
data_queue.put('Python')
data_queue.put('Hello')
data_queue.put('World')
print(data_queue.qsize())
print(data_queue.get())
# PriorityQueue()로 큐 만들기
data_queue = queue.PriorityQueue()
data_queue.put((10, '김사과')) # 키값이 작을수록 우선 순위가 높음
data_queue.put((5, '반하나'))
data_queue.put((7, '오렌지'))
data_queue.put((2, '이메론'))
data_queue.put((8, '채리'))
print(data_queue.qsize())
print(data_queue.get())
print(data_queue.get())
# 리스트 변수로 큐를 다루는 enqueue, dequeue 기능 구현하기
queue_list = list()
def enqueue(data):
queue_list.append(data)
def dequeue():
data = queue_list[0]
del queue_list[0]
return data
print(len(queue_list))
for index in range(10):
enqueue(index)
print(len(queue_list))
print(queue_list)
print(dequeue())
print(dequeue())
print(queue_list)
2. 스택의 구조
- LIFO(Last-In, First-Out): 나중에 넣은 데이터를 먼저 꺼낼 수 있는 구조
- 한쪽 끝에서만 요소가 추가되거나 제거되는 자료 구조
2-1. 스택의 용어
- push: 데이터를 스택에 쌓기
- pop: 데이터를 스택에서 꺼내기
2-2. 스택의 사용
- 컴퓨터 내부의 프로세스 구조의 함수 동작 방식
2-3. 큐와 스택의 장단점
- 장점
- 구조가 단순해서 구현하기 쉬움
- 데이터 저장/읽기 속도가 빠름
- 단점
- 데이터 최대 개수를 미리 정해야 함 -> 스택: 파이썬의 경우 재귀함수는 1000번까지만 호출이 가능
- 저장 공간의 낭비가 발생할 수 있음 -> 미리 최대 개수만큼 저장 공간을 확보해야 함
- 스택과 큐는 단순하고 빠른 성능을 위해 사용하므로 보통 배열 구조를 활용해서 구현하는 것이 일반적
# 파이썬 리스트 기능에서 제공하는 메소드로 스택 사용하기
data_stack = list()
print(data_stack)
data_stack.append(2) # push
data_stack.append(10)
data_stack.append(4)
data_stack.append(8)
print(data_stack)
data_stack.pop() # pop
print(data_stack)
# 리스트 변수로 스택을 다루는 pop, push 기능 구현하기 (단, 리스트 pop push 함수 사용 금지)
stack_list = list()
def stackPush(data):
stack_list.append(data)
def stackPop():
data = stack_list[-1]
del stack_list[-1]
return data
print(len(stack_list))
for index in range(10):
stackPush(index)
print(len(stack_list))
print(stack_list)
print(stackPop())
print(stack_list)
'파이썬 > 파이썬 자료구조와 알고리즘' 카테고리의 다른 글
파이썬 자료구조 (6) 트리 (0) | 2024.10.17 |
---|---|
파이썬 자료구조 (5) 해시 테이블 (1) | 2024.10.16 |
파이썬 자료구조 (4) 더블링크드리스트 (0) | 2024.10.16 |
파이썬 자료구조 (3) 링크드리스트 (0) | 2024.10.16 |
파이썬 자료구조 (1) 배열 (0) | 2024.10.16 |