Python带求和功能栈pop后求和异常:求原因及修正方案
问题描述
需要实现一个带求和功能的栈类AddingStack,要求:
push方法:将值压入栈的同时,把该值累加到sum变量中pop方法:从栈中弹出值的同时,从sum变量中减去该值
目前代码未实现上述核心逻辑,且执行pop后调用求和方法得到的结果不符合预期:实际输出为28,预期应为9。
相关代码
class Stack: def __init__(self): self.__stack_list = [] def push(self, val): self.__stack_list.append(val) def pop(self): val = self.__stack_list[-1] del self.__stack_list[-1] return val class AddingStack(Stack): def __init__(self): Stack.__init__(self) self.__sum = 0 def add(self): for i in self._Stack__stack_list: if i in self._Stack__stack_list: self.__sum = self.__sum + i return self.__sum stack_object = Stack() stack_object = AddingStack() stack_object.push(3) stack_object.push(6) stack_object.push(10) print(stack_object._Stack__stack_list) print(stack_object.add()) stack_object.pop() print(stack_object._Stack__stack_list) print(stack_object.add())
实际输出
[3, 6, 10] 19 [3, 6] 28
预期输出
[3, 6, 10] 19 [3, 6] 9
问题原因
- 核心逻辑未实现:
AddingStack没有重写父类的push和pop方法,完全没做到“push累加、pop减值”的要求,而是靠add方法循环计算总和。 - sum变量重复累加:
add方法每次调用都会把栈内元素的值累加到__sum上,不会重置。第一次调用后__sum是19,第二次调用时又把当前栈的3+6=9加进去,19+9=28,这就是错误的直接原因。 - 私有属性访问不规范:直接用
_Stack__stack_list访问父类私有属性,属于依赖Python名称修饰的不规范写法,可读性和维护性差。
解决方案
按照需求重写push和pop方法,实时维护__sum变量,去掉冗余的循环计算:
class Stack: def __init__(self): self.__stack_list = [] def push(self, val): self.__stack_list.append(val) def pop(self): val = self.__stack_list[-1] del self.__stack_list[-1] return val # 提供安全的栈元素访问方法(可选) def get_stack_elements(self): return self.__stack_list.copy() class AddingStack(Stack): def __init__(self): super().__init__() # 更规范的父类构造调用方式 self.__sum = 0 def push(self, val): super().push(val) # 复用父类的压栈逻辑 self.__sum += val # 同步累加值到sum def pop(self): val = super().pop() # 复用父类的出栈逻辑 self.__sum -= val # 同步从sum中减去弹出的值 return val def get_sum(self): # 直接返回维护好的sum,无需循环计算 return self.__sum # 测试代码 stack_object = AddingStack() stack_object.push(3) stack_object.push(6) stack_object.push(10) print(stack_object.get_stack_elements()) print(stack_object.get_sum()) stack_object.pop() print(stack_object.get_stack_elements()) print(stack_object.get_sum())
运行结果
[3, 6, 10] 19 [3, 6] 9
内容的提问来源于stack exchange,提问作者AshKash
相关产品推荐
相关产品推荐

