"""
https://leetcode.com/problems/min-stack/
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
Implement the MinStack class:
- MinStack() initializes the stack object.
- void push(int val) pushes the element val onto the stack.
- void pop() removes the element on the top of the stack.
- int top() gets the top element of the stack.
- int getMin() retrieves the minimum element in the stack.
You must implement a solution with O(1) time complexity for each function.
"""
class MinStack:
def __init__(self):
self.stack = []
self.min = []
def push(self, val: int) -> None:
self.stack.append(val)
newMin = min(val, self.getMin() if self.min else val)
self.min.append(newMin)
def pop(self) -> None:
if not self.stack:
raise IndexError("stack is empty")
self.stack.pop()
self.min.pop()
def top(self) -> int:
if not self.stack:
raise IndexError("stack is empty")
return self.stack[-1]
def getMin(self) -> int:
if not self.min:
raise IndexError("stack is empty")
return self.min[-1]