[Go版]算法通关村第四关青铜——如何基于数组和链表实现栈

栈的特点

在这里插入图片描述

特点:先入后出,后入先出
应用:函数内部定义的变量一般都放在栈上

基于数组实现栈

源码地址: GitHub-golang版本

func NewStack1[T any](maxNum int) *Stack1[T]{
	slice := make([]T, maxNum)
	return &Stack1[T]{
		MaxNum:maxNum,
		Array:slice,
		Top:0,
	}
}

type Stack1[T any] struct {
	MaxNum int
	Array []T
	Top int	//栈顶上的位置
}

func (this *Stack1[T]) Push(val T) error {
	if this.IsFull() {
		this.ExpandCap(this.MaxNum)
	}
	this.Array[this.Top] = val
	this.Top++
	return nil
}

func (this *Stack1[T]) Pop() (val T, err error) {
	val, err = this.Peek()
	if err == nil {
		this.Top--
	}
	return val, err
}

func (this *Stack1[T]) Peek() (val T, err error) {
	if this.IsEmpty() {
		return val, errors.New("stack empty")
	}
	return this.Array[this.Top-1], nil
}

func (this *Stack1[T]) IsFull() bool {
	return this.MaxNum == this.Top
}

func (this *Stack1[T]) IsEmpty() bool {
	return this.Top == 0
}

func (this *Stack1[T]) ExpandCap(size int) {
	tmpArray := make([]T, this.MaxNum+size)
	this.Array = append(this.Array, tmpArray ...)
	this.MaxNum = this.MaxNum+size
}

基于链表实现栈

源码地址: GitHub-golang版本

func NewStack2[T any]() *Stack2[T] {
	return &Stack2[T]{}
}

type LinkNode[T any] struct {
	Val T 
	Next *LinkNode[T]
}
type Stack2[T any] struct {
	Head *LinkNode[T]
}

func (this *Stack2[T]) Push(val T) error {
	if this.IsEmpty() {
		this.Head = &LinkNode[T]{
			Val:val,
		}
		return nil
	}
	newNode := &LinkNode[T]{
		Val:val,
		Next:this.Head,
	}
	this.Head = newNode
	return nil
}

func (this *Stack2[T]) Pop() (val T, err error) {
	val, err = this.Peek()
	if err == nil {
		this.Head = this.Head.Next
	}
	return val, err
}

func (this *Stack2[T]) Peek() (val T, err error) {
	if this.IsEmpty() {
		return val, errors.New("stack empty")
	}
	return this.Head.Val, nil
}

func (this *Stack2[T]) IsEmpty() bool {
	return this.Head == nil
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值