亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Go標(biāo)準(zhǔn)容器之Ring的使用說明

Go標(biāo)準(zhǔn)容器之Ring的使用說明

熱門標(biāo)簽:外呼系統(tǒng)顯本地手機(jī)號 外呼系統(tǒng)用什么卡 評價(jià)高的400電話辦理 百度地圖標(biāo)注后傳給手機(jī) 電話機(jī)器人軟件免費(fèi) 阿克蘇地圖標(biāo)注 excel地圖標(biāo)注分布數(shù)據(jù) 涿州代理外呼系統(tǒng) 壽光微信地圖標(biāo)注

簡介

Go的標(biāo)準(zhǔn)包Container中包含了常用的容器類型,包括conatiner/list,container/heap,container/ring,本篇講解container/ring的使用。

ring包

ring包提供了環(huán)形鏈表的操作。它僅導(dǎo)出了一個(gè)類型,Ring:

// Ring表示環(huán)形鏈表中的元素。
type Ring struct {
    Value interface{} // Value類型為interface{},因此可以接受任意類型
}
// 創(chuàng)建一個(gè)長度為n的環(huán)形鏈表
func New(n int) *Ring
// 針對環(huán)形鏈表中的每一個(gè)元素x進(jìn)行f(x)操作
func (r *Ring) Do(f func(interface{}))
// 獲取環(huán)形鏈表長度
func (r *Ring) Len() int
// 如果r和s在同一環(huán)形鏈表中,則刪除r和s之間的元素,
// 被刪除的元素組成一個(gè)新的環(huán)形鏈表,返回值為該環(huán)形鏈表的指針(即刪除前,r->Next()表示的元素)
// 如果r和s不在同一個(gè)環(huán)形鏈表中,則將s插入到r后面,返回值為
// 插入s后,s最后一個(gè)元素的下一個(gè)元素(即插入前,r->Next()表示的元素)
func (r *Ring) Link(s *Ring) *Ring
// 移動(dòng) n % r.Len() 個(gè)位置,n正負(fù)均可
func (r *Ring) Move(n int) *Ring
// 返回下一個(gè)元素
func (r *Ring) Next() *Ring
// 返回前一個(gè)元素
func (r *Ring) Prev() *Ring
// 刪除r后面的 n % r.Len() 個(gè)元素
func (r *Ring) Unlink(n int) *Ring

示例

Ring的用法

package main
import (
    "container/ring"
    "fmt"
)
func main() {
    const rLen = 3
    // 創(chuàng)建新的Ring
    r := ring.New(rLen)
    for i := 0; i  rLen; i++ {
        r.Value = i
        r = r.Next()
    }
    fmt.Printf("Length of ring: %d\n", r.Len()) // Length of ring: 3
    // 該匿名函數(shù)用來打印Ring中的數(shù)據(jù)
    printRing := func(v interface{}) {
        fmt.Print(v, " ")
    }
    r.Do(printRing) // 0 1 2
    fmt.Println()
    // 將r之后的第二個(gè)元素的值乘以2
    r.Move(2).Value = r.Move(2).Value.(int) * 2
    r.Do(printRing) // 0 1 4
    fmt.Println()
    // 刪除 r 與 r+2 之間的元素,即刪除 r+1
    // 返回刪除的元素組成的Ring的指針
    result := r.Link(r.Move(2))
    r.Do(printRing) // 0 4
    fmt.Println()
    result.Do(printRing) // 1
    fmt.Println()
    another := ring.New(rLen)
    another.Value = 7
    another.Next().Value = 8 // 給 another + 1 表示的元素賦值,即第二個(gè)元素
    another.Prev().Value = 9 // 給 another - 1 表示的元素賦值,即第三個(gè)元素
    another.Do(printRing) // 7 8 9
    fmt.Println()
    // 插入another到r后面,返回插入前r的下一個(gè)元素
    result = r.Link(another)
    r.Do(printRing) // 0 7 8 9 4
    fmt.Println()
    result.Do(printRing) // 4 0 7 8 9
    fmt.Println()
    // 刪除r之后的三個(gè)元素,返回被刪除元素組成的Ring的指針
    result = r.Unlink(3)
    r.Do(printRing) // 0 4
    fmt.Println()
    result.Do(printRing) // 7 8 9
    fmt.Println()
}

模擬約瑟夫問題

環(huán)形列表可以模擬約瑟夫問題。約瑟夫問題描述如下:

來自百度:

據(jù)說著名猶太歷史學(xué)家 Josephus有過以下的故事:在羅馬人占領(lǐng)喬塔帕特后,39 個(gè)猶太人與Josephus及他的朋友躲到一個(gè)洞中,39個(gè)猶太人決定寧愿死也不要被敵人抓到,于是決定了一個(gè)自殺方式,41個(gè)人排成一個(gè)圓圈,由第1個(gè)人開始報(bào)數(shù),每報(bào)數(shù)到第3人該人就必須自殺,然后再由下一個(gè)重新報(bào)數(shù),直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。首先從一個(gè)人開始,越過k-2個(gè)人(因?yàn)榈谝粋€(gè)人已經(jīng)被越過),并殺掉第k個(gè)人。接著,再越過k-1個(gè)人,并殺掉第k個(gè)人。這個(gè)過程沿著圓圈一直進(jìn)行,直到最終只剩下一個(gè)人留下,這個(gè)人就可以繼續(xù)活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個(gè)與第31個(gè)位置,于是逃過了這場死亡游戲。

用代碼模擬如下:

package main
import (
    "container/ring"
    "fmt"
)
type Player struct {
    position int  // 位置
    alive    bool // 是否存活
}
func main() {
    const (
        playerCount = 41  // 玩家人數(shù)
        startPos    = 1  // 開始報(bào)數(shù)位置
    )
    deadline := 3
    r := ring.New(playerCount)
    // 設(shè)置所有玩家初始值
    for i := 1; i = playerCount; i++ {
        r.Value = Player{i, true}
        r = r.Next()
    }
    // 如果開始報(bào)數(shù)的位置不為1,則設(shè)置開始位置
    if startPos > 1 {
        r = r.Move(startPos - 1)
    }
    counter := 1  // 報(bào)數(shù)從1開始,因?yàn)橄旅娴难h(huán)從第二個(gè)開始計(jì)算
    deadCount := 0  // 死亡人數(shù),初始值為0
    for deadCount  playerCount {  // 直到所有人都死亡,否則循環(huán)一直執(zhí)行
        r = r.Next() // 跳到下一個(gè)人
        // 如果是活著的人,則報(bào)數(shù)
        if r.Value.(*Player).alive {
            counter++
        }
        // 如果報(bào)數(shù)為deadline,則此人淘汰出局
        if counter == deadline {
            r.Value.(*Player).alive = false
            fmt.Printf("Player %d died!\n", r.Value.(*Player).position)
            deadCount++
            counter = 0  // 報(bào)數(shù)置成0
        }
    }
}

輸出如下,可以看到16和31是最后兩個(gè)出隊(duì)列的,因此Josephus將他的朋友與自己安排在第16個(gè)與第31個(gè)位置是安全的。

Player 3 died!
Player 6 died!
Player 9 died!
Player 12 died!
Player 15 died!
Player 18 died!
Player 21 died!
Player 24 died!
Player 27 died!
Player 30 died!
Player 33 died!
Player 36 died!
Player 39 died!
Player 1 died!
Player 5 died!
Player 10 died!
Player 14 died!
Player 19 died!
Player 23 died!
Player 28 died!
Player 32 died!
Player 37 died!
Player 41 died!
Player 7 died!
Player 13 died!
Player 20 died!
Player 26 died!
Player 34 died!
Player 40 died!
Player 8 died!
Player 17 died!
Player 29 died!
Player 38 died!
Player 11 died!
Player 25 died!
Player 2 died!
Player 22 died!
Player 4 died!
Player 35 died!
Player 16 died!
Player 31 died!

補(bǔ)充:go語言中container容器數(shù)據(jù)結(jié)構(gòu)heap、list、ring

heap堆的使用:

package main 
import (
    "container/heap"
    "fmt"
)
 
type IntHeap []int 
//我們自定義一個(gè)堆需要實(shí)現(xiàn)5個(gè)接口
//Len(),Less(),Swap()這是繼承自sort.Interface
//Push()和Pop()是堆自已的接口
 
//返回長度
func (h *IntHeap) Len() int {
    return len(*h);
}
 
//比較大小(實(shí)現(xiàn)最小堆)
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];
}
 
//壓入數(shù)據(jù)
func (h *IntHeap) Push(x interface{}) {
    //將數(shù)據(jù)追加到h中
    *h = append(*h, x.(int))
}
 
//彈出數(shù)據(jù)
func (h *IntHeap) Pop() interface{} {
    old := *h;
    n := len(old);
    x := old[n-1];
    //讓h指向新的slice
    *h = old[0: n-1];
    //返回最后一個(gè)元素
    return x;
}
 
//打印堆
func (h *IntHeap) PrintHeap() {
    //元素的索引號
    i := 0
    //層級的元素個(gè)數(shù)
    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();
    //彈出數(shù)據(jù),保證每次操作都是規(guī)范的堆結(jié)構(gòu)
    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鏈表的使用:

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() {
    //創(chuàng)建一個(gè)鏈表
    l := list.New();
 
    //鏈表最后插入元素
    a1 := l.PushBack(1);
    b2 := l.PushBack(2);
 
    //鏈表頭部插入元素
    l.PushFront(3);
    l.PushFront(4);
 
    printList(l);
 
    //取第一個(gè)元素
    f := l.Front();
    fmt.Println(f.Value);
 
    //取最后一個(gè)元素
    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);
 
    //移動(dòng)元素到最后
    l.MoveToBack(a1);
    printList(l);
 
    //移動(dòng)元素到頭部
    l.MoveToFront(a1);
    printList(l);
 
    //移動(dòng)元素在某元素之后
    l.MoveAfter(b2, a1);
    printList(l);
 
    //移動(dòng)元素在某元素之前
    l.MoveBefore(b2, a1);
    printList(l);
 
    //刪除某元素
    l.Remove(a1);
    printList(l);
}

ring環(huán)的使用:

package main; 
import (
    "container/ring"
    "fmt"
)
 
func printRing(r *ring.Ring) {
    r.Do(func(v interface{}) {
        fmt.Print(v.(int), " ");
    });
    fmt.Println();
}
 
func main() {
    //創(chuàng)建環(huán)形鏈表
    r := ring.New(5);
    //循環(huán)賦值
    for i := 0; i  5; i++ {
        r.Value = i;
        //取得下一個(gè)元素
        r = r.Next();
    }
    printRing(r);
    //環(huán)的長度
    fmt.Println(r.Len());
 
    //移動(dòng)環(huán)的指針
    r.Move(2);
 
    //從當(dāng)前指針刪除n個(gè)元素
    r.Unlink(2);
    printRing(r);
 
    //連接兩個(gè)環(huán)
    r2 := ring.New(3);
    for i := 0; i  3; i++ {
        r2.Value = i + 10;
        //取得下一個(gè)元素
        r2 = r2.Next();
    }
    printRing(r2);
 
    r.Link(r2);
    printRing(r);
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • go語言中GOPATH GOROOT的作用和設(shè)置方式
  • go設(shè)置多個(gè)GOPATH的方式
  • 淺談golang 中time.After釋放的問題
  • golang 定時(shí)任務(wù)方面time.Sleep和time.Tick的優(yōu)劣對比分析
  • golang日志包logger的用法詳解
  • golang elasticsearch Client的使用詳解
  • goland設(shè)置顏色和字體的操作
  • go 類型轉(zhuǎn)換方式(interface 類型的轉(zhuǎn)換)

標(biāo)簽:銅川 吐魯番 梅河口 蘭州 欽州 雞西 汕頭 重慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go標(biāo)準(zhǔn)容器之Ring的使用說明》,本文關(guān)鍵詞  標(biāo)準(zhǔn),容器,之,Ring,的,使用說明,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go標(biāo)準(zhǔn)容器之Ring的使用說明》相關(guān)的同類信息!
  • 本頁收集關(guān)于Go標(biāo)準(zhǔn)容器之Ring的使用說明的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    麻豆系列 在线视频| 国产美女在线一区二区三区| 精品国产一区二区三区久久久蜜臀| 日韩中文字幕在线亚洲一区| 亚洲精品中文字幕久久久久久| 97视频免费在线观看| 黄视频网站在线免费观看| 国产极品白嫩美女在线观看看 | 黄视频网站在线免费观看| 亚洲 激情| 色综合久久天天综合| 国产高清视频免费| 日韩在线观看视频免费| 欧美一级视| 成人在激情在线视频| 黄视频网站免费| 国产一区二区精品久久91| a级毛片免费全部播放| 黄视频网站在线看| 国产不卡在线观看视频| 欧美激情一区二区三区在线| 97视频免费在线| 日韩专区在线播放| 中文字幕97| 国产成人欧美一区二区三区的| 999精品影视在线观看| 成人在激情在线视频| 久草免费资源| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日本伦理黄色大片在线观看网站| 国产麻豆精品| 中文字幕97| 国产原创中文字幕| 国产网站免费视频| 韩国三级视频网站| 精品视频免费观看| 国产不卡在线观看视频| 国产成a人片在线观看视频| 国产一区免费观看| 韩国毛片免费| 国产一区免费在线观看| 欧美1卡一卡二卡三新区| 日日日夜夜操| 久久99中文字幕久久| 999精品影视在线观看| 欧美一级视| 青青久久精品| 日日夜夜婷婷| 人人干人人插| 美女免费精品视频在线观看| 午夜欧美成人久久久久久| 日韩av东京社区男人的天堂| 亚洲 国产精品 日韩| 精品国产一区二区三区国产馆| 成人免费一级毛片在线播放视频| 国产网站免费在线观看| 国产伦精品一区二区三区在线观看| 日韩中文字幕在线亚洲一区| 国产美女在线一区二区三区| 四虎影视久久久免费| 久久国产精品自由自在| 精品久久久久久影院免费| 在线观看成人网 | 欧美激情伊人| 国产综合成人观看在线| 国产伦精品一区二区三区无广告| 日本免费看视频| 欧美爱爱动态| 超级乱淫黄漫画免费| a级毛片免费全部播放| 99久久精品国产麻豆| 亚洲精品久久久中文字| 中文字幕一区二区三区精彩视频| 精品视频在线观看免费| 九九热国产视频| 午夜欧美福利| 亚洲女人国产香蕉久久精品 | 91麻豆精品国产综合久久久| 久久久久久久久综合影视网| 国产国产人免费视频成69堂| 国产网站麻豆精品视频| 亚洲第一色在线| 国产一区二区精品| 午夜欧美福利| 香蕉视频久久| 成人免费观看网欧美片| 国产国产人免费视频成69堂| 一级毛片视频播放| 国产综合成人观看在线| 精品视频在线观看视频免费视频 | 超级乱淫黄漫画免费| 日日夜夜婷婷| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 九九精品久久| 久久国产精品永久免费网站| 免费一级片在线| a级精品九九九大片免费看| 欧美另类videosbestsex视频| 国产视频一区在线| 日本伦理黄色大片在线观看网站| 一级毛片视频免费| 精品国产三级a| 精品久久久久久影院免费| 日韩avdvd| 欧美大片一区| 日韩在线观看免费完整版视频| 999久久久免费精品国产牛牛| 亚欧视频在线| 精品久久久久久综合网| 亚洲女初尝黑人巨高清在线观看| 天天色成人网| 国产一区免费观看| 国产视频一区二区在线观看| 青青青草影院| 韩国三级视频网站| 久久99爰这里有精品国产| 免费国产在线观看| 一a一级片| 亚洲wwwwww| 精品视频一区二区| 人人干人人插| 精品国产一区二区三区久| 99热视热频这里只有精品| 午夜欧美成人香蕉剧场| 欧美爱色| 国产综合成人观看在线| 久久国产一久久高清| 九九九网站| 午夜欧美成人久久久久久| 99久久网站| 九九免费高清在线观看视频| 国产网站免费视频| 九九九网站| 国产亚洲精品aaa大片| 日本伦理片网站| 免费国产在线观看| 国产a网| 精品在线视频播放| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 台湾毛片| 成人免费一级毛片在线播放视频| 亚久久伊人精品青青草原2020| 亚洲www美色| 国产麻豆精品hdvideoss| 国产伦精品一区二区三区在线观看| 999精品在线| 黄视频网站在线免费观看| 91麻豆精品国产高清在线| 国产精品1024永久免费视频| 国产精品免费久久| 毛片的网站| 午夜激情视频在线观看| 99色视频在线观看| 青青久久精品| 黄色短视屏| 高清一级毛片一本到免费观看| 成人免费福利片在线观看| 可以在线看黄的网站| 国产成人啪精品视频免费软件| 久久99中文字幕久久| 麻豆系列国产剧在线观看| 免费国产在线观看| 人人干人人插| 一级毛片视频播放| 精品国产香蕉在线播出| 91麻豆精品国产自产在线| 国产精品自拍一区| 999精品在线| 黄色免费网站在线| 久草免费在线视频| 精品国产一区二区三区久久久蜜臀 | 毛片的网站| 国产成人啪精品| 国产视频一区二区在线播放| 国产麻豆精品视频| 欧美a免费| 午夜激情视频在线观看| 欧美另类videosbestsex| 国产高清视频免费| 欧美18性精品| 国产成人女人在线视频观看| 国产一区二区精品尤物| 99热热久久| 日韩中文字幕在线观看视频| 日本特黄特黄aaaaa大片| 国产韩国精品一区二区三区| 午夜家庭影院| 久久精品免视看国产明星| 99久久精品国产高清一区二区 | 黄视频网站免费看| 国产不卡在线观看视频| 一本伊大人香蕉高清在线观看| 欧美一区二区三区在线观看| 亚久久伊人精品青青草原2020| a级精品九九九大片免费看| 久久国产精品自由自在| 一级毛片视频免费| 免费一级片网站| 91麻豆精品国产自产在线观看一区 | 国产原创视频在线|