python,泛型函数

时间:2012-08-24 22:41:02

标签: python

如何在python中创建通用堆栈? 我在python中的堆栈实现:

class Node(object):
    def __init__(self, d):
        self.data = d
        self.nextNode = None

class Stack(object):
    def __init__(self):
        self.top = None

    def push(self, item):
        newNode = Node(item)
        newNode.nextNode = self.top
        self.top = newNode

    def pop(self):
        if self.top == None:
            return None
        item = self.top.data
        self.top = self.top.nextNode
        return item

现在我正在放置Node类的对象,但是如何实现泛型Stack以便我可以放任何东西。例如,如果我想创建新类型的节点

class NodeWithMin:
    def __init__(self, value, minval):
        self.data = value
        self.minval = minval

并且能够基于这些类型的节点创建堆栈,所以它应该是这样的(当然它不起作用):

class StackWithMin(qs.Stack):
    def push(self, val):
        if self.peek() != None:
            minval = min(self.peek().value, val)
        else:
            minval = val
        qs.Stack.push(NodeWithMinV2(val, minval))

任何想法?

编辑: 它没有用,因为我有下一个错误:

unbound method push() must be called with Stack instance as first argument (got NodeWithMinV2 instance instead)

我错过了self

1 个答案:

答案 0 :(得分:2)

你可以使用一个列表,但我完全理解你如何想要更好的抽象。

您还可以在集合模块中使用deque。它可以从任何一端添加或删除,并且比列表更好地抽象。

你看起来很棒。如果你想在其中添加一个最小值的东西,只需创建一个新类,并将它的实例作为item参数传递给push方法。

我在这里猜测,但如果您想要的是一个优先级队列,您可以通过推送时间顺序弹出最不重要的节点而不仅仅是给定端的东西,您可以查看heapq模块。它也不是非常抽象的,但是它有效,并且它很快,并且没有什么可以阻止你自己更好地抽象它。