go语言中container容器数据结构heap、list、ring


本文摘自网络,作者,侵删。

go语言中container容器数据结构heap、list、ring

heap堆的使用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

package main

 

import (

    "container/heap"

    "fmt"

)

 

type IntHeap []int

 

//我们自定义一个堆需要实现5个接口

//Len(),Less(),Swap()这是继承自sort.Interface

//Push()和Pop()是堆自已的接口

 

//返回长度

func (h *IntHeap) Len() int {

    return len(*h);

}

 

//比较大小(实现最小堆)

func (h *IntHeap) Less(i, j int) bool {

    return (*h)[i] < (*h)[j];

}

 

//交换值

func (h *IntHeap) Swap(i, j int) {

    (*h)[i], (*h)[j] = (*h)[j], (*h)[i];

}

 

//压入数据

func (h *IntHeap) Push(x interface{}) {

    //将数据追加到h中

    *h = append(*h, x.(int))

}

 

//弹出数据

func (h *IntHeap) Pop() interface{} {

    old := *h;

    n := len(old);

    x := old[n-1];

    //让h指向新的slice

    *h = old[0: n-1];

    //返回最后一个元素

    return x;

}

 

//打印堆

func (h *IntHeap) PrintHeap() {

    //元素的索引号

    i := 0

    //层级的元素个数

    levelCount := 1

    for i+1 <= h.Len() {

        fmt.Println((*h)[i: i+levelCount])

        i += levelCount

        if (i + levelCount*2) <= h.Len() {

            levelCount *= 2

        } else {

            levelCount = h.Len() - i

        }

    }

}

 

func main() {

    a := IntHeap{6, 2, 3, 1, 5, 4};

    //初始化堆

    heap.Init(&a);

    a.PrintHeap();

    //弹出数据,保证每次操作都是规范的堆结构

    fmt.Println(heap.Pop(&a));

    a.PrintHeap();

    fmt.Println(heap.Pop(&a));

    a.PrintHeap();

    heap.Push(&a, 0);

    heap.Push(&a, 8);

    a.PrintHeap();

}

list链表的使用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

package main;

 

import (

    "container/list"

    "fmt"

)

 

func printList(l *list.List) {

    for e := l.Front(); e != nil; e = e.Next() {

        fmt.Print(e.Value, " ");

    }

    fmt.Println();

}

 

func main() {

    //创建一个链表

    l := list.New();

 

    //链表最后插入元素

    a1 := l.PushBack(1);

    b2 := l.PushBack(2);

 

    //链表头部插入元素

    l.PushFront(3);

    l.PushFront(4);

 

    printList(l);

 

    //取第一个元素

    f := l.Front();

    fmt.Println(f.Value);

 

    //取最后一个元素

    b := l.Back();

    fmt.Println(b.Value);

 

    //获取链表长度

    fmt.Println(l.Len());

 

    //在某元素之后插入

    l.InsertAfter(66, a1);

 

    //在某元素之前插入

    l.InsertBefore(88, a1);

 

    printList(l);

 

    l2 := list.New();

    l2.PushBack(11);

    l2.PushBack(22);

    //链表最后插入新链表

    l.PushBackList(l2);

    printList(l);

 

    //链表头部插入新链表

    l.PushFrontList(l2);

    printList(l);

 

    //移动元素到最后

    l.MoveToBack(a1);

    printList(l);

 

    //移动元素到头部

    l.MoveToFront(a1);

    printList(l);

 

    //移动元素在某元素之后

    l.MoveAfter(b2, a1);

    printList(l);

 

    //移动元素在某元素之前

    l.MoveBefore(b2, a1);

    printList(l);

 

    //删除某元素

    l.Remove(a1);

    printList(l);

}

ring环的使用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

package main;

 

import (

    "container/ring"

    "fmt"

)

 

func printRing(r *ring.Ring) {

    r.Do(func(v interface{}) {

        fmt.Print(v.(int), " ");

    });

    fmt.Println();

}

 

func main() {

    //创建环形链表

    r := ring.New(5);

    //循环赋值

    for i := 0; i < 5; i++ {

        r.Value = i;

        //取得下一个元素

        r = r.Next();

    }

    printRing(r);

    //环的长度

    fmt.Println(r.Len());

 

    //移动环的指针

    r.Move(2);

 

    //从当前指针删除n个元素

    r.Unlink(2);

    printRing(r);

 

    //连接两个环

    r2 := ring.New(3);

    for i := 0; i < 3; i++ {

        r2.Value = i + 10;

        //取得下一个元素

        r2 = r2.Next();

    }

    printRing(r2);

 

    r.Link(r2);

    printRing(r);



本文来自:51CTO博客

感谢作者:mb6066e165689bf

查看原文:go语言中container容器数据结构heap、list、ring

相关阅读 >>

Golang怎么判断channel是否关闭

Golang几种字符拼接性能分析

Go的值类型和引用类型2——内存分配规则

Golang zip中文乱码怎么解决

Go的切片(进阶版)

Golang指针转字符串,Golang字符串转指针

[系列] - 使用 Go modules 包管理工具(一)

Golang查找文件是否存在的方法

搭建vscode Golang开发环境

Golang如何做一个服务器?

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...