heap堆的使用:

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链表的使用:

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的更多相关文章

  1. 【翻译】go语言中的map实战

    业余时间翻译,水平很差,如有瑕疵,纯属无能. 原文链接 http://blog.golang.org/go-maps-in-action go语言中的map实战 1. 简介 哈希表是计算机科学中最重要 ...

  2. C语言中setjmp与longjmp学习笔记

    C语言中setjmp与longjmp学习笔记 一.基础介绍 头文件:#include<setjmp.h> 原型:  int setjmp(jmp_buf envbuf) ,然而longjm ...

  3. 对C语言中static的理解

    对C语言中的static关键字的深入理解 在一次面试的时候面试官问我static全局变量与全局变量的区别,之前虽然用过但是并没仔细去搞懂他,这次来细心的学习一下. 基本概念 使用static有三种情况 ...

  4. Go语言中的map(十一)

    map是一种无序的基于 key-value 的数据结构,Go语言中的map是引用类型,所以跟切片一样需要初始化才能使用. 定义map 定义 map 的语法如下: map[keyType]ValueTy ...

  5. C语言中typedef用法

    C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等) ...

  6. c语言中的malloc函数

    少壮不努力,大一的时候c语言学得不扎实,最近学数据结构的时候看到c语言中malloc函数都不知道了,这里记录一下,避免以后再忘. malloc的全称是memory allocation,中文叫动态内存 ...

  7. C++语言中std::array的神奇用法总结,你需要知道!

    摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此, ...

  8. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  9. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

随机推荐

  1. Zabbix3.0版Graphtree的安装配置

    Graphtrees:  https://github.com/OneOaaS/graphtrees 如果是采用yum安装的zabbix-server, 则使用以下方式: # mv /usr/shar ...

  2. java基础总结001

    1     sdf.parse()和sdf.format()它们两者的用法   http://www.imooc.com/wenda/detail/324671 3     Java String.s ...

  3. Object-c @property与@synthesize的配对使用。

    功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明. 如: 1.在头文件中: @property int count; 等效于在头文件中声明2个方法: - (int)count; ...

  4. oc字符串与c字符串转换和拷贝

    // Helper method to create C string copy NSString* MakeNSString (const char* string) { if (string) { ...

  5. MVC缺点总结

    MVC的缺点: 1.完全理解MVC比较复杂. 由于MVC模式提出的时间不长,加上同学们的实践经验不足,所以完全理解并掌握MVC不是一个很容易的过程. 2.调试困难. 因为模型和视图要严格的分离,这样也 ...

  6. python判断任务是CPU密集型还是IO密集型

    目前已经知道,在需要并发执行任务的时候,需要使用多线程或者多进程;如果是IO密集型任务,使用多线程,如果是CPU密集型任务,使用多进程;但问题是,经常我们会遇到一种情况就是:需要被执行的任务既有IO操 ...

  7. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

  8. 转载一篇必须超级好的JVM配置实战

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...

  9. mui-图文列表 图片大小问题

    下面是源码,不能调节图片大小 <ul class="mui-table-view"> <li class="mui-table-view-cell mu ...

  10. svn git 必须理解的概念

    不都是SCM代码管理嘛,有很大区别么?很多svn老鸟都是抱着这样的心态去学习git,然后无一幸免地陷入“查阅过很多资料,依然掌握不好”的困境,至少我们团队是这样的. 网上的资料确实已经很多了,却没有把 ...