背景

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. red hat 7、centos7的root密码破译

    一.在开机画面时按"E". 二.找到linux16开头的这段,在段尾添加空格"rd.break"然后按Ctrl+x进入系统紧急救援模式. 三.新的界面出现命令行 ...

  2. Python 之并发编程之进程中(守护进程(daemon)、锁(Lock)、Semaphore(信号量))

    五:守护进程 正常情况下,主进程默认等待子进程调用结束之后再结束守护进程在主进程所有代码执行完毕之后,自动终止kill -9 进程号 杀死进程.守护进程的语法:进程对象.daemon = True设置 ...

  3. C语言for循环嵌套示例

    打印九九乘法表 #include <stdio.h> int main() {   int n,i,j; for (i=1;i<=9;i++) printf("%-4d&q ...

  4. synchronized和volatile关键字

    synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synch ...

  5. spring mvc ,spring boot 整合swagger

    https://blog.csdn.net/qq_35992900/article/details/81274436

  6. 安装lnmp1.5到最后出现Error: MySQL install failed的解决方法

    解决方法: mv /usr/bin/cmake /usr/bin/cmake.backup wget http://www.cmake.org/files/v3.0/cmake-3.0.2.tar.g ...

  7. django-redis和redis连接

    redis连接 简单连接 import redis r = redis.Redis(host=) r.set('foo', 'Bar') print r.get('foo') 连接池 import r ...

  8. 设备树DTS 学习:1-有关概念

    背景 设备树在Linux驱动开发中是一种比较常用的架构. 参考:<设备树DTS使用总结> .<linux内核设备树及编译> Linux设备树 介绍 在Linux 2.6中,ar ...

  9. 数据库建表并返回给前端 - (mysql-thinkphp) (3)

    1.先建一个表,你可以用mysql代码建,也可以用thinkphp建,也可以视图建,我用不到太复杂的,就用视图建了. 2.配置id为自增,唯一的值,不可重复.主键.要输入中文的选择utf8_gener ...

  10. mysql创建数据库并设置字符集编码

    create database `mydb` character set utf8 collate utf8_general_ci;