---
# System prepended metadata

title: '[Min Stack](https://leetcode.com/problems/min-stack/)'
tags: [Leetcode, Stack, Medium]

---

# [Min Stack](https://leetcode.com/problems/min-stack/)
###### tags: `Leetcode`, `Medium`, `Stack`

## Approach
* We will use a stack to store the elements to be added to the min stack
* Instead of storing the number, we will store a tuple containing the element to be stored and the minimum value observed in the stack so far i.e. `(val, min_val)`
* This way, every element that occurs at the top of the stack will have the minimum element as well

## Asymptotic Analysis
### Time Complexity: 
- **#push(val): O(1)**
- **#pop(): O(1)** 
- **#top(): O(1)** 
- **#getMin(): O(1)** 
### Space Complexity: **O(N)**

## Code
``` python
from typing import Tuple


class MinStack:
    def __init__(self):
        self.stack = []

    def _top(self) -> Tuple:
        return self.stack[-1]

    def push(self, val: int) -> None:
        min_val = min(val, self.get_min()) if self.stack else val
        self.stack.append((val, min_val))
        print("Added " + str(val) + " to the stack. \n"
                                    "Current Min Value in stack is " + str(self.get_min()))
        print()

    def pop(self) -> None:
        print("Removing " + str(self.top()) + " from the stack")
        self.stack.pop()
        print("Removed")
        print()

    def top(self) -> int:
        return self._top()[0]

    def get_min(self) -> int:
        return self._top()[1]


stack = MinStack()
print("Pushing to stack >>> ")
stack.push(3)
stack.push(6)
stack.push(1)
stack.push(2)
stack.push(4)
for _ in range(3):
    stack.pop()
    print("Min in stack: " + str(stack.get_min()))
    print()
print("Top element: " + str(stack.top()))
```