標籤:i+1 end append 語言 ack ret class pac remove
heap堆的使用:
package mainimport ("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 := 1for i+1 <= h.Len() {fmt.Println((*h)[i: i+levelCount])i += levelCountif (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鏈表的使用:
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環的使用:
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);}
go語言中container容器資料結構heap、list、ring