[Go版]算法通关村第四关白银——最小栈&最大栈

最小栈

题目链接:LeetCode-155. 最小栈
在这里插入图片描述

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]
}

最大栈

在这里插入图片描述

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	//栈顶从0开始
}

// 将元素压入栈中
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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值