---
title: '155. Min Stack'
description: Design a stack that supports push, pop, top, and retrieving the minimum element in constant time
sidebar:
  label: 'Min Stack'
  badge: 'Medium'
---

Stack

::::warning
You must implement a solution with O(1) time complexity for each function.
::::

### Example 1:
- Input: ``
- Output: ``
- Explanation: Input `["MinStack","push","push","push","getMin","pop","top","getMin"]` [[],[-2],[0],[-3],[],[],[],[]] Output `[null,null,null,null,-3,null,0,-2]` Explanation MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); // return `-3` minStack.pop(); minStack.top();    // return `0` minStack.getMin(); // return `-2`

### Constraints:

- `-2^31 <= val <= 2^31 - 1`
- Methods pop, top and getMin operations will always be called on non-empty stacks.
- At most 3 * 10^4 calls will be made to push, pop, top, and getMin.

## Approach

```mermaid
flowchart TD
  subgraph state["two parallel stacks — same depth, always"]
    A["stack — the values"]
    B["minStack — the minimum as of that depth"]
  end
  state --> P
  subgraph P["push(value)"]
    P1["stack.append(value)"] --> P2["minStack.append(min(value, minStack[-1]))"]
  end
  state --> O
  subgraph O["pop()"]
    O1["pop both stacks together"]
  end
  state --> R
  subgraph R["top() / getMin() — O(1)"]
    R1(["stack[-1] / minStack[-1]"])
  end
```

## Solution

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

    def push(self, value: int) -> None:
        self.stack.append(value)
        value = min(value, self.minStack[-1] if self.minStack else value)
        self.minStack.append(value)

    def pop(self) -> None:
        self.stack.pop()
        self.minStack.pop()

    def top(self) -> int:
        return self.stack[-1]

    def getMin(self) -> int:
        return self.minStack[-1]


# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(value)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
```

## Explanation

[Design Min Stack - Amazon Interview Question - Leetcode 155 - Python](https://www.youtube.com/watch?v=qkLl7nAwDPo)
