Go語言(container學習)


本文來自:CSDN博客

感謝作者:ACHelloWorld

查看原文:Go語言(container介紹)

container:容器 | container

可以看出包含三部分:heap,list和ring。下面分別介紹

1. heap

   heap即為堆,是一種常用的數據結構,在源碼里面,提供了接口,在實際使用時需要實現。

   下面是一個關於heap使用的實例。

   代碼:

package main

import (
    "fmt"
    "container/heap"    
)

//heap提供了接口,需要自己實現如下方法
type Heap []int

//構造的是小頂堆,大頂堆只需要改一下下面的符號
func (h *Heap) Less(i, j int) bool {
    return (*h)[i] < (*h)[j]
}

func (h *Heap) Swap(i, j int) {
    (*h)[i], (*h)[j] = (*h)[j], (*h)[i]
}

func (h *Heap) Len() int {
    return len(*h)
}

func (h *Heap) Pop() interface{} {
    x := (*h)[h.Len() - 1]
    *h = (*h)[: h.Len() - 1]
    return x
}

func (h *Heap) Push(x interface{}) {
    *h = append(*h, x.(int))
}

func (h *Heap) Remove(idx int) interface{} {
    h.Swap(idx, h.Len() - 1)
    return h.Pop()
}

func main(){
    
    //創建一個heap
    h := &Heap{}
    
    heap.Init(h)
    //向heap中插入元素
    h.Push(5)
    h.Push(2)
    h.Push(1)
    h.Push(8)
    h.Push(4)
    h.Push(6)
    h.Push(2)

    //輸出heap中的元素,相當於一個數組,原始數組
    fmt.Println(h)

    //這里必須要reheapify,建立好堆了
    heap.Init(h)

    //小頂堆對應的元素在數組中的位置
    fmt.Println(h)

    //移除下標為5的元素,下標從0開始
    h.Remove(5)

    //按照堆的形式輸出
    for h.Len() > 0 {
        fmt.Printf("%d ", heap.Pop(h))
    }
    fmt.Println()
}

 

2. list

   list類型是雙向鏈表,具體用法如下

   代碼:

package main

import (
    "fmt"
    "container/list"    
)

func main(){

    //創建一個雙向鏈表
    ls := list.New()

    //向雙向鏈表中插入26個小寫字母
    for i := 97; i < 123; i++ {
        ls.PushFront(i)     //PushFront()代表從頭部插入,同樣PushBack()代表從尾部插入
    }

    //遍歷雙向鏈表ls中的所有字母
    for it := ls.Front(); it != nil; it = it.Next() {
        fmt.Printf("%c ", it.Value)
    }
    fmt.Println()
}

ListElement。前者實現了一個雙向鏈表(以下簡稱鏈表),而后者則代表了鏈表中元素的結構。

ListElement都是結構體類型。結構體類型有一個特點,那就是它們的零值都會是擁有其特定結構,但沒有任何定制化內容的值,相當於一個空殼


List的主要方法:

MoveBefore:給定的元素移動到另一個元素的前面

MoveAfter:給定的元素移動到另一個元素的后面

MoveToFront:把給定的元素移動到鏈表的最前端

MoveToBack:把給定的元素移動到鏈表的最后端

Front:獲取鏈表中最前端

Back:獲取鏈表中最后端

InsertBefore:指定的元素之前插入新元素

InsertAfter:指定的元素之后插入新元素

PushFront:用於在鏈表的最前端插入新元素。

PushBack:用於在鏈表的最前端插入新元素。

 

3. ring

   ring是一個環形鏈表,具體用法可以參考如下代碼

   代碼:

package main

import (
    "fmt"
    "container/ring"    //閉環包引入,詳見/usr/local/go/src/pkg/container/ring
)

func main(){
    //創建10個元素的閉環
    r := ring.New(10)

    //給閉環中的元素賦值
    for i := 1; i <= r.Len(); i++ {
        r.Value = i
        r = r.Next()
    }

    //循環打印閉環中的元素值
    r.Do(
        func(p interface{}){
            println(p)
        })
    
    //獲得當前元素之后的第5個元素
    r5 := r.Move(5)
    fmt.Println(r5)
    fmt.Println(r)

    //鏈接當前元素r與r5,相當於刪除了r與r5之間的元素
    r1 := r.Link(r5)
    fmt.Println(r1)
    fmt.Println(r)
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM