Golang 基于数组、链表实现栈

下面基于数组和链表实现的自定义栈,只有简单的功能

  • Top() 返回栈顶元素
  • Pop() 元素出栈
  • Push(data int) 元素入栈
package main

type stack interface {
	Top() int
	Pop() int
	Push(data int)
}

type Liststack struct {
	data []int
	size int
	lock sync.Mutex
}

type LinkStack struct {
	root *LinkNode
	size int
	lock sync.Mutex
}

func NewListstack() *Liststack {
	return &Liststack{
		data: make([]int, 0),
		size: 0,
		lock: sync.Mutex{},
	}
}

func NewLinkStack() *LinkStack {
	return &LinkStack{
		root: nil,
		size: 0,
		lock: sync.Mutex{},
	}
}

func (ls *Liststack) Top() int {
	if ls.data == nil || len(ls.data) == 0 {
		log.Panic("当前栈是空的")
	}
	return ls.data[ls.size-1]
}

func (ls *Liststack) Pop() int {

	ls.lock.Lock()
	defer ls.lock.Unlock()

	if ls.data == nil || len(ls.data) == 0 {
		log.Panic("当前栈是空的")
	}

	ls.size--
	last := ls.data[ls.size]
	ls.data = ls.data[:ls.size]
	return last
}

func (ls *Liststack) Push(data int) {
	ls.lock.Lock()
	defer ls.lock.Unlock()

	ls.data = append(ls.data, data)
	ls.size++
}

type LinkNode struct {
	data int
	next *LinkNode
}

func (ls *LinkStack) Top() int {
	if ls.root == nil {
		log.Panic("当前栈是空的")
	}
	return ls.root.data
}

func (ls *LinkStack) Pop() int {

	ls.lock.Lock()
	defer ls.lock.Unlock()

	if ls.root == nil {
		log.Panic("当前栈是空的")
	}
	current := ls.root
	ls.root = current.next
	ls.size--
	return current.data
}

func (ls *LinkStack) Push(data int) {

	ls.lock.Lock()
	defer ls.lock.Unlock()

	node := &LinkNode{
		data: data,
		next: nil,
	}

	if ls.root == nil {
		ls.root = node
	} else {
		current := ls.root
		node.next = current

		ls.root = node
	}
	ls.size++
}

func main() {
	ls := NewLinkStack()
	ls.Push(10)
	ls.Push(20)
	ls.Push(30)
	ls.Push(40)
	ls.Push(50)
	ls.Push(60)

	fmt.Printf("lick stack size: %d\n", ls.size)
	ls.Pop()
	ls.Pop()
	ls.Pop()
	fmt.Printf("lick stack size: %d\n", ls.size)
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值