# Min Stack

Hi Geeks. Welcome to 100 Days of Leetcode challenge.

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

• push(x) — Push element x onto stack.
• pop() — Removes the element on top of the stack.
• top() — Get the top element.
• getMin() — Retrieve the minimum element in the stack.

Example:

```MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> Returns -3.
minStack.pop();
minStack.top();      --> Returns 0.
minStack.getMin();   --> Returns -2.```

## Solution

I really loved this approach. It really improved something in me. See the solution, you will understand, how easily we can achieve this.

```public class MinStack {

/** initialize your data structure here. */

Stack<int[]> stack;
public MinStack() {
stack = new Stack<int[]>();
}

public void Push(int x) {
if(stack.Count == 0)
{
stack.Push(new int[]{x,x});
}
else{
int currentMin = stack.Peek()[1];
stack.Push(new int[]{x,Math.Min(x,currentMin)});
}
}

public void Pop() {
stack.Pop();
}

public int Top() {
return stack.Peek()[0];
}

public int GetMin() {
return stack.Peek()[1];
}
}

/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.Push(x);
* obj.Pop();
* int param_3 = obj.Top();
* int param_4 = obj.GetMin();
*/
```

All the operations takes O(1) time – Constant time.