优先队列和堆

我正在尝试根据文档中提供的示例实现优先级队列。文档: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 方法有指针接收器)


慕村225694
浏览 214回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go