# 155. Min Stack

Medium
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.
Example 1:
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:
• `-231 <= val <= 231 - 1`
• Methods `pop`, `top` and `getMin` operations will always be called on non-empty stacks.
• At most `3 * 104` calls will be made to `push`, `pop`, `top`, and `getMin`.

### 解題

type MinStack struct {
min []int
stack []int
}
func Constructor() MinStack {
return MinStack{ }
}
func (this *MinStack) Push(val int) {
if len(this.stack) == 0 {
this.stack = []int{ val }
this.min = []int{ val }
} else {
this.stack = append(this.stack, val)
if val < this.min[len(this.min) - 1]{
this.min = append(this.min, val)
} else {
this.min = append(this.min, this.min[len(this.min) - 1])
}
}
}
func (this *MinStack) Pop() {
this.stack = this.stack[:len(this.stack) - 1]
this.min = this.min[:len(this.min) - 1]
}
func (this *MinStack) Top() int {
return this.stack[len(this.stack) - 1]
}
func (this *MinStack) GetMin() int {
return this.min[len(this.min) - 1]
}
/**
* Your MinStack object will be instantiated and called as such:
* obj := Constructor();
* obj.Push(val);
* obj.Pop();
* param_3 := obj.Top();
* param_4 := obj.GetMin();
*/