题目:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack()初始化堆栈对象。void push(int val)将元素val推入堆栈。void pop()删除堆栈顶部的元素。int top()获取堆栈顶部的元素。int getMin()获取堆栈中的最小元素。
解法:
用栈minStack,保存已入栈stack中的最小值。minStack栈顶为已入栈stack中所有元素的最小值。
这个题目的意思是每次Pop(),Push()之后仍然要能用O(1)的时间查找栈中的最小值
type MinStack struct {
stack *Stack
minStack *Stack
}
func Constructor() MinStack {
return MinStack{
stack: &Stack{make([]int, 0)},
minStack: &Stack{make([]int, 0)},
}
}
func (this *MinStack) Push(val int) {
this.stack.Push(val)
if this.minStack.IsEmpty() || val <= this.minStack.Top() {
this.minStack.Push(val)
}
}
func (this *MinStack) Pop() {
top := this.stack.Top()
if !this.minStack.IsEmpty() && top == this.minStack.Top(){
this.minStack.Pop()
}
this.stack.Pop()
}
func (this *MinStack) Top() int {
return this.stack.Top()
}
func (this *MinStack) GetMin() int {
return this.minStack.Top()
}
// 实现一个栈
type Stack struct {
Arr []int
}
func (this *Stack) Push(val int) {
this.Arr = append(this.Arr, val)
}
func (this *Stack) Pop() {
this.Arr = this.Arr[:len(this.Arr)-1]
}
func (this *Stack) Top() int {
return this.Arr[len(this.Arr)-1]
}
func (this *Stack) IsEmpty() bool {
return len(this.Arr) == 0
}