zoukankan      html  css  js  c++  java
  • golang用slice、list当queue

    背景

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

    slice当queue

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

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

    list当queue

    初始化一个队里:
    queue := list.New()
    
    入队一个元素:
    queue.PushBack(1)
    
    出队一个元素:
    if queue.Len() > 1 {
        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() > 0 {
            curlen := queue.Len()
            var curList []int
            for i:= 0; 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(1)
        queue.PushBack(2)
        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(0)
        fmt.Println(queue)
    
        queue2 := list.New()
        queue2.PushBack(8)
        queue2.PushBack(9)
    
        queue3 := list.New()
        queue2.PushBack(-1)
    
        queue.PushBackList(queue2)
        queue.PushFrontList(queue3)
    
        fmt.Println(queue.Len())
        queue.Remove(queue.Front())
        fmt.Println(queue.Len())
    
        queue.InsertBefore(100, queue.Front())
        queue.MoveAfter(queue.Front(), queue.Front().Next())
    
    }
  • 相关阅读:
    请朋友做事,须以名誉为限,为朋友做事,亦须以名誉为限
    这世上总有一些人记得你,关注着你,牵挂着你
    杏花春雨已不再,牧童遥指已不再,剑门细雨渭城轻尘也都已不再
    如果要你做鲁滨逊,你会选第三型还是第二型的朋友做“礼拜五”呢
    人类最不能伤害的就是自尊
    单靠理论和教训是无济于事的
    交真朋友已是件比较奢侈的事儿
    他一定是一个懂生活、懂人生,爱自己、爱别人的人
    国子监,就是从前的大学
    只有把理想和现实有机结合起来,才有可能成为一个成功之人
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/12257359.html
Copyright © 2011-2022 走看看