在Python3中使用优先级队列进行堆栈

时间:2018-07-29 16:56:06

标签: python python-3.x

我想出了以下代码,但不知何故,它无法正常工作。这可能是什么原因。想法是将一对计数和项目放入优先队列,然后弹出。但是如何在python3中实现呢?

import heapq

class Stack:

    def __init__(self):
        self.dict ={}
        self.cnt = 0
        self.hq = []

    def push(self, item):
        self.cnt += 1
        self.heappush(hq, {self.cnt:item})

    def pop(self):
        self.cnt -= 1
        return self.heappop(hq)

if __name__ == '__main__':
    s = Stack()
    s.push(10)
    s.push(20)
    s.push(30)
    print(s.pop())

我收到以下错误。

Traceback (most recent call last):
  File "/home/shrivatsa/Documents/E/Learning-Path/Python/Algorithms and Datastructure/stackpriorityqueue.py", line 19, in <module>
    s.push(10)
  File "/home/shrivatsa/Documents/E/Learning-Path/Python/Algorithms and Datastructure/stackpriorityqueue.py", line 11, in push
    self.heappush(hq, {self.cnt:item})
AttributeError: 'Stack' object has no attribute 'heappush'

2 个答案:

答案 0 :(得分:1)

self关键字用于引用对象,通过这种方式,我们可以指定我们引用的是在类中定义的属性或方法heappushheappop不是在Stack类中定义的,而是在heapq库中定义的,因此应将它们分别命名为heapq.heappushheapq.heappop

要考虑的另一个问题是字典没有定义顺序,因此不能将它们推入堆中。如果要保存这些对,则应改用元组。

示例:

import heapq

class Stack:

    def __init__(self):
        self.cnt = 0
        self.hq = []

    def push(self, item):
        self.cnt += 1
        heapq.heappush(self.hq, (self.cnt, item))

    def pop(self):
        self.cnt -= 1
        return heapq.heappop(self.hq)

if __name__ == '__main__':
    s = Stack()
    s.push(10)
    s.push(20)
    s.push(30)
    print(s.pop())

答案 1 :(得分:0)

heappushheappopheapq库中的函数。例如,当您编写self.heappush(...)时,就是说“使用来自该实例的数据调用名为heappush的此类中的函数)”。但是您的类Stack没有名为heappush的函数,因此会出错。

要从heapq库中调用函数,请改用heapq.heappush(...)heapq.heappop(...)