# CSPT17 Lecture 7
## [Min Stack](https://leetcode.com/problems/min-stack/)
```
class MinStack:
"""
Plan
Use a deque to implement stack
Use minSoFar to keep track of min element in the stack
For pushing - update minSoFar if value to push is < minSoFar
For popping - if element to pop is > minSoFar, then that's fine
however, if element == minSoFar, then look at elements left and find new minSoFar
For top - just return the last element in the deque
For getMin - return self.minSoFar
"""
def __init__(self):
"""
initialize your data structure here.
"""
self.myStack = deque()
self.minSoFar = float("inf")
# Runtime: O(1)
def push(self, x: int) -> None:
if x < self.minSoFar:
self.minSoFar = x
self.myStack.append(x)
# Runtime: O(n)
def pop(self) -> None:
val = self.myStack.pop()
if val == self.minSoFar:
if len(self.myStack) > 0:
self.minSoFar = min(self.myStack)
else:
self.minSoFar = float("inf")
# O(1)
def top(self) -> int:
return self.myStack[-1]
# O(1)
def getMin(self) -> int:
return self.minSoFar
```
## [Stack Using Queues](https://leetcode.com/problems/implement-stack-using-queues/submissions/)
```
from collections import deque
class MyStack:
"""
Understand
myStack = MyStack()
myStack.push(1)
myStack.push(2)
myStack.top() --> 2
myStack.pop() --> 2
myStack.top() --> 1
myStack.pop() --> 1
myStack.empty() --> True
Plan
"""
def __init__(self):
"""
Initialize your data structure here.
"""
self.queue = deque()
def push(self, x: int) -> None:
"""
Push element x onto stack.
"""
self.queue.append(x)
def pop(self) -> int:
"""
Removes the element on top of the stack and returns that element.
"""
newQueue = deque()
# transfer all old elements to a new queue (except for the last one)
while len(self.queue) > 1:
curr = self.queue.popleft()
newQueue.append(curr)
lastElement = self.queue.popleft()
self.queue = newQueue
return lastElement
def top(self) -> int:
"""
Get the top element.
"""
return self.queue[-1] if len(self.queue) > 0 else float("inf")
def empty(self) -> bool:
"""
Returns whether the stack is empty.
"""
return len(self.queue) == 0
```