链表实现栈的__len__函数报错:'Stack'对象无'size'属性
解决链表实现栈的__len__方法报错问题
嘿,我来帮你搞定这个问题~你遇到的'Stack' object has no attribute 'size'错误原因很直白:你的Stack类里根本没定义size这个属性,所以__len__方法里直接返回self.size肯定会触发属性不存在的报错。
下面给你两种可行的解决方案,按需选择就行:
方案1:维护一个size计数器(推荐,O(1)时间复杂度)
这种方法是在栈初始化时就创建一个size变量,每次执行入栈(push)或出栈(pop)操作时更新这个变量,__len__方法直接返回它,效率很高。
修改后的完整代码如下:
class Node: """链表的节点类。""" def __init__(self, item): self.item = item self.next_node = None class Stack(object): def __init__(self): self.head = None # 新增:初始化size为0 self.size = 0 def push(self, item): """入栈操作:把元素放到栈顶""" new_node = Node(item) new_node.next_node = self.head self.head = new_node # 入栈后size加1 self.size += 1 def pop(self): """出栈操作:移除并返回栈顶元素""" if self.is_empty(): raise IndexError("Pop from empty stack") popped_item = self.head.item self.head = self.head.next_node # 出栈后size减1 self.size -= 1 return popped_item def is_empty(self): """判断栈是否为空""" return self.head is None def __len__(self): """返回栈的长度——调用len(s)会触发此方法""" return self.size
方案2:遍历链表计算长度(O(n)时间复杂度)
如果你不想维护额外的size变量,也可以在__len__方法里直接遍历整个链表,统计节点的数量。不过这种方法每次调用len()都要遍历一遍链表,效率会低一些,适合栈元素不多的场景。
修改后的__len__方法如下:
def __len__(self): """返回栈的长度——调用len(s)会触发此方法""" count = 0 current_node = self.head while current_node is not None: count += 1 current_node = current_node.next_node return count
小提醒
如果用方案1,记得在pop方法里判断栈是否为空,避免出现size变成负数的情况(比如上面代码里加了is_empty判断和异常抛出)。
内容的提问来源于stack exchange,提问作者Magic_Whizz
相关产品推荐
相关产品推荐

