背景

golang没有queue这种类型,不过可以用slice、list模拟

slice当queue

声明队列
var queue []int 入队一个元素:
queue = append(queue, ) 出队一个元素:
if len(queue) > {
queue = queue[:]
}

问题:当不断入队列时,需不停的扩容

list当queue

初始化一个队里:
queue := list.New() 入队一个元素:
queue.PushBack() 出队一个元素:
if queue.Len() > {
queue.Remove(queue.Front())
}

实例:层次遍历二叉树

list题解

func levelOrderBottom(root *TreeNode) [][]int {
var result [][]int
if root == nil {
return result
}
queue := list.New()
queue.PushBack(root)
for queue.Len() > {
curlen := queue.Len()
var curList []int
for i:= ; i < curlen; i++ {
curTree := queue.Remove(queue.Front()).(*TreeNode)
curList = append(curList, curTree.Val)
if curTree.Left != nil {
queue.PushBack(curTree.Left)
}
if curTree.Right != nil {
queue.PushBack(curTree.Right)
}
}
result = append([][]int{curList}, result...)
}
return result
}

list用法

type Element
func (e *Element) Next() *Element
func (e *Element) Prev() *Element
type List
func New() *List
func (l *List) Back() *Element // 最后一个元素
func (l *List) Front() *Element // 第一个元素
func (l *List) Init() *List // 链表初始化
func (l *List) InsertAfter(v interface{}, mark *Element) *Element // 在某个元素后插入
func (l *List) InsertBefore(v interface{}, mark *Element) *Element // 在某个元素前插入
func (l *List) Len() int // 在链表长度
func (l *List) MoveAfter(e, mark *Element) // 把e元素移动到mark之后
func (l *List) MoveBefore(e, mark *Element) // 把e元素移动到mark之前
func (l *List) MoveToBack(e *Element) // 把e元素移动到队列最后
func (l *List) MoveToFront(e *Element) // 把e元素移动到队列最头部
func (l *List) PushBack(v interface{}) *Element // 在队列最后插入元素
func (l *List) PushBackList(other *List) // 在队列最后插入接上新队列
func (l *List) PushFront(v interface{}) *Element // 在队列头部插入元素
func (l *List) PushFrontList(other *List) // 在队列头部插入接上新队列
func (l *List) Remove(e *Element) interface{} // 删除某个元素

举例

func listTest() {
queue := list.New()
queue.PushBack()
queue.PushBack()
fmt.Println(queue.Front())
fmt.Println(queue.Front().Value)
fmt.Println(queue.Front().Next().Value)
fmt.Println(queue.Back().Value)
fmt.Println(queue.Len())
queue.PushFront()
fmt.Println(queue) queue2 := list.New()
queue2.PushBack()
queue2.PushBack() queue3 := list.New()
queue2.PushBack(-) queue.PushBackList(queue2)
queue.PushFrontList(queue3) fmt.Println(queue.Len())
queue.Remove(queue.Front())
fmt.Println(queue.Len()) queue.InsertBefore(, queue.Front())
queue.MoveAfter(queue.Front(), queue.Front().Next()) }

golang用slice、list当queue的更多相关文章

  1. golang 对slice的深拷贝 copy

    测试 slice的地址 copy的时候 发现有问题: package main import "fmt" func main() { nums:=[]int{1,2,3,4,5} ...

  2. golang:slice切片

    一直对slice切片这个概念理解的不是太透彻,之前学习python的就没搞清楚,不过平时就用python写个工具啥的,也没把这个当回事去花时间解决. 最近使用go开发又遇到这个问题,于是打算彻底把这个 ...

  3. golang array, slice, string笔记

    本来想写一篇关于golang io的笔记,但是在学习io之前必须了解array, slice, string概念,因此将在下篇写golang io.   array: 数组的长度是该数组类型的一部分, ...

  4. golang error (slice of unaddressable value)

    使用 Golang 将生成的 md5 转化为 string 的过程出现如下编译错误: 错误解析: 值得注意的一点是  func Sum(data []byte) [Size]byte  这个函数返回的 ...

  5. [Golang]-1 Slice与数组的区别

    目录 数组 1.创建数组: 2.数组是值拷贝传递: 切片(slice) 1.首先看看slice的源码结构: 2.slice的创建: 3.slice使用make创建 4.切片作为参数传递 5.Golan ...

  6. Golang Clearing slice

    //first method : slice = nil // second method : slice = slice[0:0] Source page : https://www.socketl ...

  7. golang切片slice

    切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, ...

  8. 使用golang的slice来模拟栈

    slice(切片):底层数据结构是数组 stack(栈):一种先进后出的数据结构 普通版的模拟写入和读取的栈 package main import "fmt" //栈的特点是先进 ...

  9. golang的slice作为函数参数传值的坑

    直接贴代码 func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, ) } func main() { slice ...

随机推荐

  1. C#对象、List<>转DataTable

    public static DataTable ObjectToTable(object obj)         {             try {                 Type t ...

  2. 蓝桥杯java 迷宫

    0101010100101100100101011001011010010000100010101000001000100000101010010000100000001001100110100101 ...

  3. 1552146271@qq.com

    北京时间9月27日早间消息,美国外卖服务DoorDash周四宣布,一项安全漏洞暴露了该公司大约490万客户.商家和送货员的个人数据. 这家总部位于旧金山的公司在一份声明中说,此次泄露的信息可能包括大约 ...

  4. storm正常任务数据量过大时造成定时任务不执行的问题

    在执行storm的定时任务时,发现storm普通任务数据量过大时造成定时任务不执行, 同时设置了storm的普通任务和定时任务,定时任务设置5秒执行1次. 普通任务的数据时从spout中不停发射字符串 ...

  5. 第1节 kafka消息队列:11、kafka的数据不丢失机制,以及kafka-manager监控工具的使用;12、课程总结

    12.kafka如何保证数据的不丢失 12.1生产者如何保证数据的不丢失 kafka的ack机制:在kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常的能够被收到 如果是同步模 ...

  6. rally问题合集

    rally 执行过程中涉及到keystone的用例,需要调用adminurl,在-/rally/lib/python2.7/site-packages/rally/osclients.py(主机文件的 ...

  7. redis-Hash(哈希表)

    Redis hash 是一个string类型的field和value的映射表,它的添加.删除操作都是O(1)(平均).hash特别适用于存储对象,将一个对象存储在hash类型中会占用更少的内存,并且可 ...

  8. 「NOIP2013」华容道

    传送门 Luogu 解题思路 预支一点东西: 这题其实有着更为思维的图模型,还十分考验码力,不简单啊 这居然是联赛题 讲正解: 显然我们对于一种合法方案,空格子肯定是一直围绕着特定棋子反复横跳的. 所 ...

  9. 097、Java中String类之修改字符串对象引用

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  10. ffmpeg 学习:002-代码架构

    前言 使用 ffmpeg 库时,最好先理解好ffmpeg的代码结构图. 下面这张图表明了FFmpeg在解码一个视频的时候的函数调用流程,为了保证结构清晰,其中仅列出了最关键的函数,剔除了其它不是特别重 ...