常用数据结构Go语言实现

[TOC]

package stack

import (
    "stack/stack"
    "stack/stackwithcapacity"
)

type Stack interface {
    // Push 添加一个元素
    Push(interface{}) bool
    // BatchPush 批量添加
    BatchPush(...interface{}) bool
    // Pop 弹出栈顶元素
    Pop() (interface{}, bool)
    // Top 获取栈顶元素
    Top() (interface{}, bool)
    // Empty 栈为空
    Empty() bool
    // Len 已使用大小
    Len() int
}

// NewStack 创建一个栈
// if cap <= 0 return 无固定容量的栈
// else return 固定容量的栈
func NewStack(cap int) Stack {
    if cap <= 0 {
        return stack.NewStack()
    }
    return stackwithcapacity.NewStack(cap)
}

基于链表实现的栈

演示地址

添加元素v.next = top.next使新添加节点指向虚拟头节点top的下一节点,而后top.next = v

基于链表实现的栈

移除元素时 记value = v.value,将 top.next = v.next; v.next = nil

基于链表实现的栈移除操作

基于slice实现固定容量的栈

演示地址

添加元素arr[top]=value; top++

固定容量的栈

移除元素时记v = arr[top], 然后top--return v

固定容量的元素弹出元素

实现如下

队列

双端队列

演示地址

添加元素

移除元素

环形队列

演示地址

在队列未满的时候往尾部添加元素q.nums[q.rear] = xq.rear = (q.rear + 1) % q.lengthrear指针后移一位

在队列已满的时候往队列中添加元素则会被拒绝。

环形队列添加元素

如果移除从队首移除元素,那么记v = q.nums[q.front]; q.front = (q.front + 1) % q.length

环形队列移除元素

优先队列

演示地址

并查集

演示地址

并查集

查询元素4所在集合根节点,在查询过程中进行了路径压缩,查询完所在集合,也会使该节点直接指向集合根节点。

并查集查询4所在集合根节点

合并元素6所在集合和元素2所在集合,最开始找到两个元素各自所在集合的根节点,然后将其中一个集合的根节点指向另一个集合的根节点。

并查集合并元素6所在集合和元素2所在集合

前缀树

演示地址

前缀树添加元素

ArrayTire

ListTrie

HashTrie

线段树

演示地址

VisuAlgo - Segment Tree - Max

跳表

最后更新于

这有帮助吗?