types - 在 Go 中实现堆栈以存储结构的正确方法是什么?

标签 types go stack

我正在尝试创建一个堆栈来存储一系列霍夫曼树结构。目前我正在使用我在 github 上找到的实现。

package util

type item struct {
    value interface{}
    next  *item
}

//Stack the implementation of stack
//this stack is not thread safe!
type Stack struct {
    top  *item
    size int
}
// Basic stack methods...

问题是,当我将霍夫曼树结构存储在堆栈中时,我无法使用霍夫曼树的任何字段,例如左/右 child 。

package huffmantree

type HuffmanTree struct {
    freq   int
    value  byte
    isLeaf bool
    left   *HuffmanTree
    right  *HuffmanTree
    code   []bool
    depth  int
}

我应该如何在 Go 中实现一个堆栈来正确存储结构并允许访问它们的字段?

编辑: 我尝试将 interface {} 部分替换为 huffmantree.HuffmanTree(huffmantree 结构)并收到此错误消息:

can't load package: import cycle not allowed
package github.com/inondle/huffman/util
    imports github.com/inondle/huffman/huffmantree
    imports github.com/inondle/huffman/util
import cycle not allowed

我的猜测是,huffmantree 类导入了 util 包,而堆栈必须导入 huffmantree 包,所以存在某种冲突?任何人都知道出了什么问题?

最佳答案

在 go 中实现堆栈的正确方法是简单地使用 slice 。

stack := []*HuffmanTree{}

你可以使用append入栈,并通过写出:

v, stack := stack[len(stack)-1], stack[:len(stack)-1]

如果愿意,您可以将其封装到自己的类型中,但 slice 更容易理解。

type Stack []*HuffmanTree{}

func NewStack() *Stack {
    var s []*HuffmanTree
    return (*Stack)(&s)
}

func (s *Stack) Pop() *HuffmanTree {
   if len(*s) == 0 {
      return nil
    }
    v = (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return v
}

func (s *Stack) Push(h *HuffmanTree) {
    *s = append(*s, h)
}

正如 icza 所观察到的,如果堆栈的生命周期比 HuffmanTree 对象长,您可能希望将堆栈中刚刚弹出的条目归零,以允许垃圾收集器收集未引用的对象。

关于types - 在 Go 中实现堆栈以存储结构的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30315334/

相关文章:

interface - golang如何访问接口(interface)字段

java - 如何正确计算堆栈中的节点数?

java - 实时监控 Java 中的总线程堆栈大小

git - go build 不起作用,因为 git 在 Linux 上被对等方重置了致命的读取错误连接

Go receiver方法调用语法困惑

Python,从子列表中删除所有数字

c - 整数大小的变化?

c++ - C++中对象的Instanceof(不是指针)

C 类型表示法

function - 是否可以在 f# 中编写这样的递归分组函数