作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在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)
我错过了自己
最佳答案
你可以只使用一个列表,但我完全理解你可能想要更好的抽象。
您还可以在集合模块中使用双端队列。它可以从任意一端添加或删除,并且比列表更好地抽象。
你的东西看起来不错。如果您想在其中放入最小值,只需创建一个新类,并将其实例作为 item 参数传递到您的 Push 方法中。
我在这里猜测,但如果你想要的是一个优先级队列,你可以在其中弹出值(value)最低的节点,而不仅仅是按时间顺序推送给定端的节点,你可以查看 heapq 模块。它也不是非常抽象,但它有效,而且速度很快,没有什么可以阻止您自己更好地抽象它。
关于python,泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12117539/
我是一名优秀的程序员,十分优秀!