Entwerfen Sie einen Stapel mit Frei-List-Feature (d. H., Nachdem ein Knoten platzt, dessen Speicherplatz durch zukünftige Push-Operation wiederverwendbar ist und in der freien Liste gespeichert wird). Der Code ist vereinfacht und macht in gewisser Hinsicht keinen Sinn, und ich benutze nur den folgenden Code, um die allgemeine Idee von Stack mit freier Liste (als Prototyp) zu zeigen.Implementieren von Stack mit Freelist-Funktion in Python 2.7
Meine Frage ist, wie man pop
Operation entwerfen. Meine Verwirrung ist, da ein Verweis auf einen Knoten nach pop
Operation zurückgegeben wird, zum Beispiel in meinem Code gibt es node1 = stack.pop()
, der Verweis auf einen Knoten könnte von Client verwendet werden, der pop
aufrufen, und der gleiche Knoten Verweis wird in der freien Liste und möglicherweise zurückgefordert von anderen push
Operation verwendet werden, wie Sie solche Konflikte lösen und Fragen für allgemeine Hinweise für Design-freie Liste Feature mit Stack, verknüpfte Liste oder Warteschlange.
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
Warum würden Sie geben einen Knoten von 'pop' wenn Ihre' push' Werte akzeptiert, nicht Knoten? Für mich wäre es sinnvoller, wenn "pop" genau dasselbe zurückgibt wie "push". – niemmi
@niemmi, schöner Fang. Dies ist eine gute Option. Gibt es eine Lösung, wenn ich sowohl 'push' als auch' pop' mit 'StackNode' anders als' int' behandeln will? –
Es tut bereits, sehen Sie Ihre 'Push'-Implementierung, es braucht einen Parameter, aber kümmert sich nicht um den Typ. Auf die gleiche Weise können Sie 'pop' verwenden, um' node.value' unabhängig vom Typ zurückzugeben. – niemmi