【发布时间】:2017-02-03 09:24:10
【问题描述】:
设计一个具有空闲列表功能的堆栈(即在一个节点被弹出后,它的空间可以被未来的推送操作重用,并保存在空闲列表中)。代码被简化了,在某些方面没有意义,我只是用下面的代码来展示堆栈与空闲列表的一般概念(作为原型)。
我的问题是关于如何设计pop 操作。我的困惑是因为在pop 操作之后返回了对节点的引用,例如在我的代码中有node1 = stack.pop(),调用pop 的客户端可能会使用对节点的引用,并且相同的节点引用是在空闲列表中回收并可能被其他 push 操作使用,如何解决此类冲突,并想知道有关使用堆栈、链表或队列设计空闲列表功能的一般建议。
MAXSIZE = 100
freeListHead = None
class StackNode:
def __init__(self, value, nextNode):
self.value = value
self.nextNode = nextNode
class Stack:
def __init__(self):
self.top = None
self.size = 0
def peek(self):
# return StackNode
return self.top
def push(self, value):
global freeListHead
if self.size >= MAXSIZE:
raise Exception('stack full')
node = freeListHead
node.value = value
freeListHead = node.nextNode
node.nextNode = self.top
self.top = node
self.size += 1
def pop(self):
if self.size == 0:
return None
node = self.top
self.top = self.top.nextNode
self.size -= 1
return node
if __name__ == "__main__":
# initialization for nodes and link them to be a free list
nodes = [StackNode(-1, None) for i in range(MAXSIZE)]
freeListHead = nodes[0]
for i in range(0, len(nodes)-1):
nodes[i].nextNode = nodes[i+1]
stack = Stack()
stack.push(1)
stack.push(50)
stack.push(100)
stack.push(200)
print stack.peek().value
node1 = stack.pop()
print node1.value
print stack.peek().value
【问题讨论】:
-
当您的
push接受值而不是节点时,为什么要从pop返回一个节点?对我来说,pop返回与push完全相同的东西会更有意义。 -
@niemmi,不错。这是一个不错的选择。如果我想要
push和pop处理StackNode而不是int,是否有解决方案? -
它已经做到了,请参阅您的
push实现,它需要一个参数但不关心类型。以同样的方式,无论类型如何,您都可以让pop返回node.value。 -
谢谢@niemmi,我的意思是如果我需要从
pop返回StackNode(出于封装的目的,因为StackNode可以包装很多其他东西,而不仅仅是@987654341 @),有什么建议可以避免冲突吗? -
这样想:除了访问
node.value之类的属性之外,您还打算如何处理返回的node?
标签: python python-2.7 stack