저번 큐를 이용한 스택 구현과 마찬가지로 파이썬의 deque를 이용해 구현하였다.
스택이다 보니 값을 한 쪽 방향에서만 넣고 뺄 수 있기 때문에 이에 맞게 appendleft와 popleft 함수를 사용해 구현했다.
from collections import deque
class MyQueue(object):
def __init__(self):
self.queue = deque()
def push(self, x):
self.queue.appendleft(x)
def pop(self):
temp_queue = deque()
for i in range(len(self.queue)):
temp_queue.appendleft(self.queue.popleft())
temp = temp_queue.popleft()
for i in range(len(temp_queue)):
self.queue.appendleft(temp_queue.popleft())
return temp
def peek(self):
temp_queue = deque()
for i in range(len(self.queue)):
temp_queue.appendleft(self.queue.popleft())
temp = temp_queue.popleft()
temp_queue.appendleft(temp)
for i in range(len(temp_queue)):
self.queue.appendleft(temp_queue.popleft())
return temp
def empty(self):
return len(self.queue) == 0
내가 구현한 pop:
원래의 큐(스택으로 구현, self.queue)에서 임시 큐(스택으로 구현, temp_queue)로 모든 요소들을 pop해서 담으면 순서가 거꾸로 된다. 이 후 이 임시 큐의 가장 위에 있는 요소를 pop하여 반환하면 큐에서 pop한 것 같은 결과를 얻을 수 있다고 생각했다.
하지만 이 방법은 for문이 두 개가 된다. 아무리 봐도 for문을 두 개나 쓰는 건 아닌 것 같아서 다른 방법을 고민해봤지만 생각이 나지 않았다.
그래서 다른 방법을 찾아보았다.
class MyQueue:
def __init__(self):
self.input = []
self.output = []
def push(self, x):
self.input.append(x)
def pop(self):
self.peek()
return self.output.pop()
def peek(self):
if not self.output:
while self.input:
self output.append(self.input.pop())
return self.output[-1]
def empty(self):
return not self.input and not self.output