class Stack:
def __init__(self):
self.top = []
def isEmpty(self):
return len(self.top) == 0
def pop(self):
return self.top.pop()
def push(self, item):
self.top.append(item)
class QueueWithStack(Stack):
def __init__(self):
self.stack1 = Stack()
self.stack2 = Stack()
self.Front = 0
self.rear = 0
def enqueue(self, item):
self.stack1.push(item)
def dequeue(self):
if self.stack2.isEmpty():
while not self.stack1.isEmpty():
item = self.stack1.pop()
self.stack2.push(item) # 출력을 담당하는 스택 2이 비어있다면 스택 1의 모든 내용물을 스택 2 로 옮긴다.
return self.stack2.pop()
else:
return self.stack2.pop()
def isEmpty(self):
if self.stack1.isEmpty() and self.stack2.isEmpty():
return True
else:
False
sQ = QueueWithStack()
for i in range(10):
sQ.enqueue(i)
for i in range(5):
print(sQ.dequeue(), end='->')
for i in range(11, 15):
sQ.enqueue(i)
print(sQ.stack1.top, sQ.stack2.top)
위에 코드에서 가장 신경써야 하는 점은 dequeue 부분이다 stack은 max량이 없으니 enqueue는 계속해서 stack1 에 쌓는것이 가능하다 하지만 dequeue는 stack2가 비어 있으면 구현이 불가능하다 따라서 이를 수정해야 하는데 이를 위해서 if 문을 사용해서 dequeue가 사용되었을 때 출력을 담당하는 부분인 두번째 스택의 빈여부를 먼저 확인한다. 이후 두번재 스택이 비어 있으면 입력을 담당하는 스택에 있는 데이터를 전부 스택 2에 옮긴다. 이후에 스택 2 에서 스택의 위부터 출력을 진행하면 순서가 선입선출로 바뀐다.