我正在尝试根据文档中提供的示例实现优先级队列。文档:priorityQueue简而言之,它看起来像这样(并非所有内容都包括在内): package pq type Item struct { container interface{} priority int index int } type PriorityQueue []*Item func NewItem(value interface{}, prio int) *Item { return &Item {container: value, priority: prio} }func (pq PriorityQueue) Len() int { return len(pq)}func (pq PriorityQueue) Less(i, j int) bool { return pq[i].priority > pq[j].priority}func (pq *PriorityQueue) Swap(i, j int) { (*pq)[i], (*pq)[j] = (*pq)[j], (*pq)[i] (*pq)[i].index = i (*pq)[j].index = j} func (pq PriorityQueue) Push(x interface{}) { fmt.Printf("adr: %p\n", &pq) n := len(pq) item := x.(*Item) item.index = n pq = append(pq, item) }func (pq *PriorityQueue) Pop() interface{} { old := *pq n := len(old) itm := old[n - 1] itm.index = -1 *pq = old[0 : n-1] return itm.container}该main.go文件:func main() { q := pq.PriorityQueue{} heap.Init(q) fmt.Printf("\nAdr: %p\n", &q) q.Push(pq.NewItem("h", 2)) for i := 0; i < 5; i++ { item := pq.NewItem("test", i * 13 % 7) heap.Push(q, item) } for q.Len() > 0 { fmt.Println("Item: " + heap.Pop(q).(string)) }}正如您在与示例进行比较时所看到的,我不使用指针,因为这样做会给我一个编译错误,告诉我我的优先级队列没有正确实现接口。当我这样做时,这给我留下了以下问题:heap.Push(q, item)该项目未附加到队列中。我试图写出队列指针地址,它显示了不同的地址。这解释了为什么它不起作用,但是切片不是很长的地图引用类型吗?更具体地说:我如何解决我的问题?希望你能帮上忙!编辑:添加完整代码和错误:不能使用 q(类型 pq.PriorityQueue)作为类型 heap.Interface 在函数参数中:pq.PriorityQueue 没有实现 heap.Interface(Pop 方法有指针接收器)
1 回答
- 1 回答
- 0 关注
- 210 浏览
添加回答
举报
0/150
提交
取消