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