Go中的堆栈和FIFO

介绍

听说是 Go 增强月,所以我正在写一篇关于 Go 的文章。

在 Go 中实现 Stack 或 FIFO 时使用 container/list。这个container/list 只提供堆栈和FIFO 所需的基础。这是因为 Stack 和 FIFO 的机制是一样的,唯一的区别是检索时是置顶还是置底。

Stack 在字段中有container/list,添加到末尾,然后从末尾取出。

package main

import (
        "container/list"
        "fmt"
)

type Stack struct {
        v *list.List
}

func NewStack() *Stack {
        return &Stack{v: list.New()}
}

func (s *Stack) Push(v interface{}) {
        s.v.PushBack(v)
}

func (s *Stack) Pop() interface{} {
        b := s.v.Back()
        if b == nil {
                return nil
        }
        return s.v.Remove(b)
}


func main() {
        s := NewStack()
        s.Push(1)
        s.Push(2)
        s.Push(3)
        fmt.Println(s.Pop())
        fmt.Println(s.Pop())
        fmt.Println(s.Pop())
}

先进先出

类似地,FIFO在字段中有container/list,添加到末尾,从开头取出。

package main

import (
        "container/list"
        "fmt"
)

type FIFO struct {
        v *list.List
}

func NewFIFO() *FIFO {
        return &FIFO{v: list.New()}
}

func (s *FIFO) Push(v interface{}) {
        s.v.PushBack(v)
}

func (s *FIFO) Pop() interface{} {
        b := s.v.Front()
        if b == nil {
                return nil
        }
        return s.v.Remove(b)
}

func main() {
        f := NewFIFO()
        f.Push(1)
        f.Push(2)
        f.Push(3)
        fmt.Println(f.Pop())
        fmt.Println(f.Pop())
        fmt.Println(f.Pop())
}

如果您想将其限制为 int这样的感觉。

概括

你说 Go 似乎没有 Stack 或 FIFO,但实际上它们有。顺便说一句,也可以使用chan实现FIFO。 chan 通常用于在 goroutine 中传递数据,但如果它有缓冲区,它也可以用作同一主 goroutine 中的 FIFO。

package main

import "fmt"

func main() {
    fifo := make(chan int, 5)
    fifo <- 1
    fifo <- 2
    fifo <- 3
    fmt.Println(<-fifo)
    fmt.Println(<-fifo)
    fmt.Println(<-fifo)
}

原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623459.html