[Python] deque (stack, queue) 구현
Python에서 list형태로 queue를 구현시 성능이슈로 인해서 deque 사용을 권장합니다.
list vs deque 성능 문제
index 0번째 추가와 출력시 성능
- list
작업 | 명령어 | 시간복잡도 |
---|---|---|
출력 | pop(0) | O(n) |
입력 | Insert(0,value) | O(n) |
- deque
작업 | 명령어 | 시간복잡도 |
---|---|---|
출력 | popleft() | O(1) |
입력 | appendleft(value) | O(1) |
deque 기본 사용법
입출력이 양방향 모두 지원하는 메소드가 존재하여, Queue, Stack을 모두 구현할 수 있습니다.
- append() : 배열뒤로 추가됨
- pop() : 오른쪽부터 출력
- popleft() : 왼쪽부터 출력
- len(q) : 수를 반환 if len(q)==0 : # Empty 조건
#리스트 타입
a = [1, 3, 5, 7, 10]
print(a.pop())
print(a.pop())
print(a)
#출력 pop은 뒤에서 부터 출력됨
10
7
[1, 3, 5]
# deque
from collections import deque
# deque([iterable, [maxlen])
q = deque()
q.append(1)
q.append(3)
q.append(5)
q.append(7)
print(q)
> deque([1, 3, 5, 7])
q.appendleft(0)
q.append(9)
print(q)
> deque([0, 1, 3, 5, 7, 9])
print(q.pop())
print(q.pop())
print(q)
print(q.popleft())
print(q.pop())
print(q.pop())
print(q)
print(q.popleft())
print(q.pop())
print(q.pop())
print(q)
print(q.popleft())
# pop() 오른쪽부터 출력됨
# popleft() 왼쪽부터 출력됨
> 9
> 7
> deque([0, 1, 3, 5])
> 0
q=deque(range(1,11))
for i in q:
print(i, end=' , ')
print("len=", len(q))
> 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , len= 10
q=deque(range(1,11))
print(q)
while q:
print(q.pop(), end=' , ')
print("len=", len(q))
> deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
> 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , len= 0
q=deque(range(1,11))
print(q)
while q:
print(q.popleft(), end=' , ')
print("len=", len(q))
> deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
> 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , len= 0
deque - Stack FILO
# Stack FILO
st = deque()
st.append(1)
st.append(2)
st.append(3)
st.append(4)
st.append(5)
## peek
print('peek :',st[-1])
print(st.pop())
print(st.pop())
print(st.pop())
print(st.pop())
print(st.pop())
#출력
> peek : 5
> 5
> 4
> 3
> 2
> 1
deque - Queue FIFO
# Queue FIFO
q = deque()
q.append(1)
q.append(2)
q.append(3)
q.append(4)
q.append(5)
## peek
print('peek :',q[0])
print(q.popleft())
print(q.popleft())
print(q.popleft())
print(q.popleft())
print(q.popleft())
#출력
> peek : 1
> 1
> 2
> 3
> 4
> 5