# 155 Min Stack

## Problem Statement

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.

**Input**

["MinStack","push","push","push","getMin","pop","top","getMin"]

[[],[-2],[0],[-3],[],[],[],[|],[-2],[0],[-3],[],[],[],[]]

**Output**

[null,null,null,null,-3,null,0,-2]

## Approach

We use two stacks, one as the "result" stack and one to keep track of minimum Values.

**Push:** If the minStack is empty and the current value is smaller/equal than the last element on the minStack we push the value onto it.

**Pop:** We pop from the stack and if that value equals the last value on the minStack we also pop from the minStack.

The other operations are straightforward

## Solution

```
var MinStack = function() {
this.stack = []
this.minStack = []
};
MinStack.prototype.push = function(val) {
this.stack.push(val)
if (!this.minStack.length || val <= this.minStack[this.minStack.length - 1]) {
this.minStack.push(val)
}
};
MinStack.prototype.pop = function() {
let x = this.stack.pop()
if (x === this.minStack[this.minStack.length - 1]) {
this.minStack.pop()
}
};
MinStack.prototype.top = function() {
return this.stack[this.stack.length - 1]
};
MinStack.prototype.getMin = function() {
return this.minStack[this.minStack.length - 1]
};
```