皆さんが何かについて特定の質問を受けるのが好きなのは知っていますが、何が間違っているのか正確にはわかりません. 理解不足なのかもしれないので、もう少し目を使えばいいのにと思いました。Python でドロップアウト スタックと呼ばれるものを作成しようとしています。プログラムの Undo 関数で使用されるプロセスと同じように、一番上に入力された値が一番下の値から飛び出します。新しい値をスタックにプッシュすると、最も古い値が Bye-Bye になるはずです。
これが私のNodeクラスです:
class Node(object):
def __init__(self, data, next = None):
"""Instantiates a Node with default next of None"""
self.data = data
self.next = next
そして本体:
from node import Node
class DropOutStack(object):
def __init__(self, n):
self._top = None
self._size = 0
self._maxlen = n #Appointed last variable that we are interested in finding
def push(self, newItem):
"""Inserts newItem at top of stack."""
self._top = Node(newItem, self._top)
if self._size < self._maxlen:
self._size += 1
#Pops off last link if max length has been reached
else:
while self._top.next.next != None:
self._top = self._top.next
removedItem = self._top.next.data
self._top.next = None
def pop(self):
"""Removes and returns the item at top of the stack.
If stack is empty, returns none with an error message."""
try:
oldItem = self._top.data
self._top = self._top.next
self._size -= 1
return oldItem
except AttributeError:
print "ERROR: Cannot pop. Stack is empty"
return None
def peek(self):
"""Returns the item at top of the stack.
If stack is empty, returns none with an error message."""
try:
return self._top.data
except AttributeError:
print "ERROR: Cannot peek. Stack is empty"
return None
def __len__(self):
"""Returns the number of items in the stack."""
return self._size
def isEmpty(self):
return len(self) == 0
def __str__(self):
"""Items strung from bottom to top."""
# Helper recurses to end of nodes
def strHelper(probe):
if probe is None:
return ""
else:
return strHelper(probe.next) + \
str(probe.data) + " "
return strHelper(self._top)
問題は push メソッドにあるようです。私のコードはリストの 3 番目のノードにしか行かないと思いますが、スタック 5 値の長さ (この場合は n は 5) で動作するようにしたいと考えています。
私が間違っていることは何だと思いますか?self._top.next.next.next にするために、そこに別の .next が必要ですか?
これは、メイン関数で取得しているサンプル出力です。
def main():
s = DropOutStack(5)
for i in xrange(10):
s.push(i+1)
print s
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 の後、出力は次のようになります。
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
6 7 8 9 10
PSキューでも同じことができることはわかっています。しかし、ここでスタックを台無しにしようとしています。
編集: プッシュ メソッドを少し編集しました。