最小栈 - 两个栈模拟

type MinStack struct {
	data []int
	min []int
}
 
 
func Constructor() MinStack {
	return MinStack{
		data: []int{},
		min: []int{},
	}
}
 
 
func (this *MinStack) Push(val int)  {
	this.data = append(this.data, val)
	if len(this.min) == 0 || 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.data = this.data[:len(this.data) - 1]
	this.min = this.min[:len(this.min) - 1]
}
 
 
func (this *MinStack) Top() int {
	return this.data[len(this.data) - 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();
 */

最小栈 - 一个栈放差值

type MinStack struct {
	data []int
	min int
}
 
 
func Constructor() MinStack {
	return MinStack{
		data: []int{},
		min: 0,
	}
}
 
 
func (this *MinStack) Push(val int)  {
	n := len(this.data)
	if n == 0 {
		this.data = append(this.data, 0)
		this.min = val
	} else {
		diff := val - this.min
		this.data = append(this.data, diff)
		if diff < 0 {
			this.min = val
		}
	}
}
 
 
func (this *MinStack) Pop() {
	n := len(this.data)
	diff := this.data[n - 1]
	if diff < 0 {
		this.min -= diff
	}
	this.data = this.data[:n - 1]
}
 
 
func (this *MinStack) Top() int {
	diff := this.data[len(this.data) - 1]
	if diff < 0 {
		return this.min
	}
	return diff + this.min
}
 
 
func (this *MinStack) GetMin() int {
	return this.min
}
 
 
/**
 * 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();
 */