155.最小栈

63 阅读1分钟

题目:
设计一个支持 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 
}