스택과 큐에 대해 정리를 하고자 합니다. 파이썬에서 스택과 큐는 모두 deque()를 사용합니다.
stack
스택은 LIFO(Last In First Out)으로 가장 늦게 들어온 값이 먼저 나간다라는 개념을 가지고 있습니다. 코드로써 구현하면 다음과 같습니다.
from collections import deque
stk = deque()
stk.append(10)
stk.append(20)
stk.append(30)
print("10, 20, 30 순서로 들어온 스택: ", stk)
removed_stk = stk.pop()
print("상단의 값을 제거: ", removed_stk)
10, 20, 30 순서로 들어온 스택: deque([10, 20, 30])
상단의 값을 제거: 30
다음과 같이 리턴된 값을 확인할 수 있습니다. deque의 내장 모듈은 여러가지가 있지만 여기서는 pop()을 사용합니다.
list랑 차이
저는 deque() 모듈을 처음 볼 때, list()랑 차이가 뭐지? 라는 생각부터 하였습니다. list에서도 pop()은 존재하는데 굳이 deque()를 써야했을까? 와 같은 생각이었습니다.
결과는 사용하는 목적에 따라 달라진다였습니다. 내가 만약 앞, 뒤의 값을 자주 꺼내서 사용해야하는 로직을 구현해야한다라고 하면 deque()를, 인덱싱을 통해 처리할 거다라고 하면 list()를 사용하면 되겠습니다. list는 인덱싱을 통한 접근에 시간 복잡도가 빠르고 deque는 양방향에서 접근할 때의 시간 복잡도가 빠르기 때문입니다.
queue
큐는 스택과 반대로 FIFO(First In First Out)으로 먼저 들어온 것이 먼저 나간다라는 개념을 가지고 있습니다. 이것 또한 파이썬으로 구현하면 다음과 같습니다. 큐도 마찬가지로 deque()를 사용합니다.
from collections import deque
q = deque()
q.append(10)
q.append(20)
q.append(30)
print("10, 20, 30 순서로 들어온 큐: ", q)
remove_q = q.popleft()
print("가장 먼저 나가는 값: ", remove_q)
10, 20, 30 순서로 들어온 큐: deque([10, 20, 30])
가장 먼저 나가는 값: 10
큐는 먼저 들어온 값이 먼저 나가야 하기에 pop()이 아닌 popleft()를 사용합니다.