フリーリスト機能を持つスタックを設計します(ノードがポップされた後、そのスペースは将来のプッシュ操作で再利用可能で、空きリストに保持されます)。コードは単純化されていて、ある視点では意味をなさないので、以下のコードを使用してフリーリスト付きプロトタイプの一般的な考え方を示しています。Python 2.7でフリーリスト機能を持つスタックを実装する
私の質問は、pop
の設計方法に関するものです。私の混乱はpop
の操作の後にノードへの参照が返されたためです。例えば、node1 = stack.pop()
というコードでは、ノードへの参照はpop
を呼び出すクライアントによって使用され、同じノード参照は空きリストで再利用されますそのような競合を解決する方法と、スタック、リンクされたリストまたはキューを持つデザインフリーリスト機能の一般的なアドバイスについては疑問があります。
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
なぜあなたはpop''からノードを返すでしょうか?私にとっては、 'pop 'が' push'に与えられたものとまったく同じことを返すのがより理にかなっています。 – niemmi
@ニームミ、いいキャッチ。これは良い選択肢の1つです。 'push'と' pop'の両方が 'int'以外の' StackNode'を扱うことを望むなら、解決策はありますか? –
これはすでに 'push'実装を参照していますが、パラメータを取りますが、その型については気にしません。同じように、型に関係なく 'node.value'を返すために' pop'を使うことができます。 – niemmi