最小栈
题目链接:LeetCode-155. 最小栈
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b2720cdaa3898b1f4049e8cc1d29787e.png)
Go代码
type MinStack struct {
MaxNum int
Array []int
MinArray []int
TopNum int
}
func Constructor() MinStack {
return MinStack{
MaxNum:10,
Array:make([]int, 10),
MinArray:make([]int, 10),
TopNum:0,
}
}
func (this *MinStack) IsEmpty() bool {
return this.TopNum == 0
}
func (this *MinStack) IsFull() bool {
return this.TopNum == this.MaxNum
}
func (this *MinStack) ExpandCal(size int) {
tmpArray := make([]int, size)
this.Array = append(this.Array, tmpArray ...)
this.MinArray = append(this.MinArray, tmpArray ...)
this.MaxNum = this.MaxNum+size
}
func (this *MinStack) Push(val int) {
if this.IsFull() {
this.ExpandCal(this.MaxNum)
}
this.Array[this.TopNum] = val
if this.IsEmpty() {
this.MinArray[this.TopNum] = val
} else {
if this.MinArray[this.TopNum-1] >= val {
this.MinArray[this.TopNum] = val
} else {
this.MinArray[this.TopNum] = this.MinArray[this.TopNum-1]
}
}
this.TopNum++
}
func (this *MinStack) Pop() (val int) {
if this.IsEmpty() {
return
}
this.TopNum--
return this.Array[this.TopNum]
}
func (this *MinStack) Top() int {
if this.IsEmpty() {
return 0
}
return this.Array[this.TopNum-1]
}
func (this *MinStack) GetMin() int {
if this.IsEmpty() {
return 0
}
return this.MinArray[this.TopNum-1]
}
最大栈
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/38c0bd5f882dfb6e07d20117aebf507e.png)
Go代码
源码地址: GitHub-golang版本
func NewMaxStack[T int|int64](maxNum int) *MaxStack[T] {
return &MaxStack[T] {
MaxNum:maxNum,
Array:make([]T, maxNum),
MaxArray:make([]T, maxNum),
TopNum:0,
}
}
type MaxStack[T int|int64] struct {
MaxNum int
Array []T
MaxArray []T
TopNum int
}
func (this *MaxStack[T]) Push(val T) error {
if this.IsFull() {
this.ExpandCap(this.MaxNum)
}
if this.IsEmpty() {
this.MaxArray[this.TopNum] = val
} else {
preMaxVal := this.MaxArray[this.TopNum-1]
if val >= preMaxVal {
this.MaxArray[this.TopNum] = val
} else {
this.MaxArray[this.TopNum] = preMaxVal
}
}
this.Array[this.TopNum] = val
this.TopNum++
return nil
}
func (this *MaxStack[T]) Pop() (val T, err error) {
val, err = this.Top()
if err != nil {
return val, err
}
this.TopNum--
return val, err
}
func (this *MaxStack[T]) IsEmpty() bool {
return this.TopNum == 0
}
func (this *MaxStack[T]) IsFull() bool {
return this.TopNum == this.MaxNum
}
func (this *MaxStack[T]) ExpandCap(size int) {
tmpArray := make([]T, size)
this.Array = append(this.Array, tmpArray ...)
this.MaxArray = append(this.MaxArray, tmpArray ...)
this.MaxNum = this.MaxNum+size
}
func (this *MaxStack[T]) Top() (val T, err error){
if this.IsEmpty() {
return val, errors.New("stack empty")
}
val = this.Array[this.TopNum-1]
return
}
func (this *MaxStack[T]) PeekMax() (val T, err error) {
if this.IsEmpty() {
return val, errors.New("stack empty")
}
val = this.MaxArray[this.TopNum-1]
return
}
func (this *MaxStack[T]) PopMax() (val T, err error) {
val, err = this.PeekMax()
if err != nil {
return val, err
}
tmpArray := make([]T, 0)
for {
tmpV, tmpErr := this.Pop()
if tmpErr != nil {
break
}
if tmpV == val {
break
}
tmpArray = append(tmpArray, tmpV)
}
for len(tmpArray) != 0 {
tmpLen := len(tmpArray)
this.Push(tmpArray[tmpLen-1])
tmpArray = tmpArray[:tmpLen-1]
}
return val ,err
}