[Data Structure] Stack & Queue & Deque
제한된 접근(삽입, 삭제)만 허용 (Stack, Queue, Dequeue 모두 동일)
Stack 스택
class Stack:
def __init__(self):
self.items = []. #데이터 저장을 위한 리스트 준비
def push(self, val):
self.items.append(val)
def pop(self):
try:
return self.items.pop() #pop할 item이 없으면
except IndexError:
print("Stack is empty") #indexError 발생
def top(self):
try:
return self.items[-1]
except IndexError:
print("Stack is empty")
def __len__(self):
return len(self.items) #len()로 호출하면 Stack의 item 수 반환
특징
- LIFO : Last In First Out
- 가장 최근에 push된 요소가 먼저 pop된다 (후입선출)
- append → push
- pop → pop
활용 예시
- 웹 브라우저 뒤로 가기 : 가장 최근에 열린 페이지부터 다시 보여줌
- 실행 취소 (Ctrl + Z) : 가장 나중에 실행된 작업을 되돌려줌
Queue 큐
class Queue:
def __init__(self):
self.items = [] #빈 리스트
self.front_index = 0
def enqueue(self, val):
self.item.append(val)
def dequeue(self):
if self.front_index == len(self.items):
print("Queue is empty")
return None
else:
x = self.items[front_index]
self.front_index += 1
return x
from queue import Queue
que = Queue()
que.put(val)
que.get()
특징
- FIFO : First In First Out
- enqueue된 순서대로 dequeue된다 (선입선출)
- front에서 dequeue되고 Rear에서 enqueue된다.
- append → enqueue → put
- pop → dequeue → get
queue 모듈의 Queue 클래스에 대한 자세한 내용은 여기 파이썬 공식 레퍼런스 참고
활용 예시
- 은행 번호표 : 가장 먼저 온 사람의 번호를 먼저 띄워 줌
- 프린터 인쇄 대기열 : 우선 순위가 같은 작업 중 가장 먼저 들어 온 문서부터 인쇄함
Dequeue (double-end-queue) 덱
from collections import deque
makeDeque() #덱 생성
appendleft() #맨 앞(왼쪽)에 자료 추가
pop() #맨 앞(왼쪽)에 자료 삭제
append() #맨 뒤(오른쪽)에 자료 추가
popleft() #맨 뒤(오른쪽)에 자료 삭제deque(maxlen=n)
reverse() #deque의 순서 뒤집음
count(x) #deque에 포함된 x의 개수 반환
clear() #deque 값 모두 삭제
특징
- Stack과 Queue를 합친 형태
- 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조
list와 deque 비교
시간 복잡도 | insert, remove, popleft | indexing, slicing |
---|---|---|
list | O(n) | O(1) |
deque | O(n) | O(n) |
고정된 길이 내에서 접근, 검색, 슬라이싱을 하는 데에는 list가 유리
데이터를 추가 or 삭제할 땐 deque이 유리