9.27最小栈设计 - WisperDin/blog GitHub Wiki

描述

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
示例:

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

思路

可以通过两个栈来实现这个逻辑,一个栈是正常存数据的栈data,另外一个栈是存最小值的栈minValue

  • Push 往data栈push,如果minValue栈为空或者当前要Push的值比栈顶的值更小,向minValue栈push;否则直接返回
  • Pop data栈pop出栈顶,考察pop出的元素是否与minValue中的栈顶元素相同,相同则pop出minValue栈顶元素
  • GetMin 获取minValue栈顶元素
  • Top 获取data栈顶元素

实现

package MinStack

import "fmt"

type MinStack struct {
	minValue *Stack
	data *Stack
}

func NewMinStack() *MinStack {
	return &MinStack{
		minValue:&Stack{},
		data:&Stack{},
	}
}


func (this *MinStack) Push(x int)  {
	this.data.Push(x)
	minValue,haveVal := this.minValue.Top()
	if !haveVal || x<minValue {
		this.minValue.Push(x)
	}
	return
}


func (this *MinStack) Pop()  {
	popVal,success := this.data.Pop()
	if !success {
		return
	}
	minValue,haveVal := this.minValue.Top()
	if !haveVal {
		fmt.Println("Pop minValue top no value!")
		return
	}
	if popVal != minValue {
		return
	}
	this.minValue.Pop()
}


func (this *MinStack) Top() int {
	topVal,haveVal := this.data.Top()
	if !haveVal {
		return -1
	}
	return topVal
}


func (this *MinStack) GetMin() int {
	minValue,haveVal := this.minValue.Top()
	if !haveVal {
		return -1
	}
	return minValue
}