我正在尝试制作一个存储一系列霍夫曼树结构的堆栈。目前我正在使用我在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...
问题在于,当我将哈夫曼树结构存储在堆栈中时,我无法使用霍夫曼树的任何字段,例如左/右子。
package huffmantree
type HuffmanTree struct {
freq int
value byte
isLeaf bool
left *HuffmanTree
right *HuffmanTree
code []bool
depth int
}
我应该如何在Go中实现一个堆栈,它将正确存储结构并允许访问其字段?
编辑:
我尝试用interface {}
(huffmantree struct)替换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包,所以存在某种冲突?谁知道出了什么问题?
答案 0 :(得分:6)
实现堆栈的正确方法就是使用切片。
stack := []*HuffmanTree{}
您可以使用append
推送到堆栈,然后按以下方式弹出:
v, stack := stack[len(stack)-1], stack[:len(stack)-1]
如果您愿意,可以将其封装到自己的类型中,但切片更容易理解。
type Stack []*HuffmanTree{}
func NewStack() *Stack {
var s []*HuffmanTree
return (*Stack)(&s)
}
func (s *Stack) Pop() *HuffmanTree {
v = (*s)[len(*s)-1]
*s = (*s)[:len(*s)-1]
return v
}
func (s *Stack) Push(h *HuffmanTree) {
*s = append(*s, h)
}
正如icza观察到的那样,如果堆栈的生存时间长于HuffmanTree对象,您可能希望将堆栈中刚刚弹出的条目归零,以允许垃圾收集器收集未引用的对象。