class MyStack(object):
def __init__(self):
self.items = []
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.items.append(x)
def pop(self):
"""
:rtype: int
"""
if self.empty():
return None
return self.items.pop()
def top(self):
"""
:rtype: int
"""
if self.empty():
return None
return self.items[-1]
def empty(self):
"""
:rtype: bool
"""
if len(self.items) > 0:
return False
return True
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()
from queue import Queue
class MyStack(object):
def __init__(self):
self.q1 = Queue()
self.q2 = Queue()
self.current_size = 0
def push(self, x):
"""
:type x: int
:rtype: None
"""
self.q1.put(x)
self.current_size += 1
def pop(self):
"""
:rtype: int
"""
if (self.q1.empty()):
return
# 한 방향 queue는 FIFO라서 queue의 get의 항상 가장 처음으로 입력한 원소임
# 반면, stack은 LIFO라서 stack의 pop은 항상 가장 마지막으로 입력한 원소임
# 결론, queue로 가장 마지막으로 입력한 원소를 얻으려면 원소 하나가 남아 있을 때까지 get을 해줘야함
while (self.q1.qsize() != 1):
self.q2.put(self.q1.get())
popped_item = self.q1.get()
self.current_size -= 1
# q2는 q1의 가장 마지막으로 입력한 원소를 얻기 위해서
# q1의 get 결과를 저장하는 임시 큐로 사용한 것이라서 아래에서 원복함
self.q1, self.q2 = self.q2, self.q1
return popped_item
def top(self):
"""
:rtype: int
"""
if (self.q1.empty()):
return
# top은 가장 마지막으로 입력된 원소를 확인하는 것
while (self.q1.qsize() != 1):
self.q2.put(self.q1.get())
top = self.q1.queue[0]
self.q2.put(self.q1.get())
self.q1, self.q2 = self.q2, self.q1
return top
def empty(self):
"""
:rtype: bool
"""
if self.current_size < 1:
return True
return False
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()