首页 > 代码库 > go语言中container容器数据结构heap、list、ring
go语言中container容器数据结构heap、list、ring
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 := 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链表的使用:
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 = http://www.mamicode.com/i;>
go语言中container容器数据结构heap、list、ring
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。