Single Queue
class MyStack:
# tc O(1) sc O(1)
def __init__(self):
self.q = collections.deque()
# tc O(1)
def push(self, x: int) -> None:
self.q.append(x)
size = len(self.q)
for i in range(size-1):
tmp = self.q.popleft()
self.q.append(tmp)
# tc O(N) sc O(N)
def pop(self) -> int:
return self.q.popleft()
# tc O(1)
def top(self) -> int:
return self.q[0]
# tc O(1)
def empty(self) -> bool:
return not self.q
Double Queue
class MyStack:
# tc O(1) sc O(1)
def __init__(self):
self.q1 = collections.deque()
self.q2 = collections.deque()
self.last = 0
# tc O(1)
def push(self, x: int) -> None:
if self.last == len(self.q1):
self.q1.append(x)
else:
self.q1[self.last] = x
self.last += 1
# tc O(N) sc O(N)
def pop(self) -> int:
i = self.last -1
while i >= 0 :
self.q2.append(self.q1[i])
i -= 1
self.last -= 1
return self.q2.popleft()
# tc O(1)
def top(self) -> int:
return self.q1[self.last-1]
# tc O(1)
def empty(self) -> bool:
return self.last == 0
# 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()