破坏性堆栈迭代

破坏性堆栈迭代,第1张

破坏性堆栈迭代

一种简单的方法可以为您的Stack提供一个可用于迭代的替代头。我还添加了一个

__len__
方法来返回堆栈的大小。

class Stack:    def __init__(self):        self.head = None        self.size = 0    def __len__(self):        return self.size    def push(self, item):        node = Node(item)        if not self.head: self.head = node        else: node.next = self.head self.head = node        self.size += 1    def pop(self):        if self.size == 0: raise ValueError('Popping off an empty stack!')        item = self.head.val        self.head = self.head.next        return item    def peek(self):        if self.size == 0: raise ValueError('Peeking into an empty stack!')        return self.head.val    def __iter__(self):        self.top = self.head        return self    def __next__(self):        if self.top: curr = self.top        else: raise StopIteration()        self.top = self.top.next        return curr.valclass Node:    def __init__(self, val):        self.val = val        self.next = Noneif __name__ == '__main__':    stack = Stack()    stack.push(12)    stack.push(13)    stack.push(9)    print('Size', len(stack))    for item in stack:        print(item)    print(stack.peek())    stack.push(42)    print('Size', len(stack))    for item in stack:        print(item)

输出

Size 3913129Size 44291312

这可能是一个好主意,添加

self.top =None
__init__
,虽然这不是绝对必要的。您可能希望将其标记为带有下划线的私人名称:
self._top

正如timgeb在评论中所暗示的那样,这种方法有些脆弱,因为我们只能在堆栈上一次只执行一次迭代

self.top


顺便说一句,您可以

push
稍微优化该方法:

def push(self, item):    node = Node(item)    if self.head:        node.next = self.head    self.head = node    self.size += 1


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667648.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存