面向对象栈的压栈判定逻辑将“能否压栈”封装于栈内部,通过max_size、allowed_type、allow_duplicates等参数控制容量、类型、重复校验,push方法执行检查后返回布尔值,成功则入栈并返回true,否则返回false。

用面向对象实现栈的压栈判定逻辑,核心是把“能不能压”这个判断从调用方收归到栈对象内部,让栈自己决定——比如容量限制、类型约束、重复校验等。不是外部先判断再调用 push,而是直接调用 push,由栈内部完成检查并返回结果或抛出异常。
封装压栈逻辑到栈类中
定义一个 Stack 类,把底层存储(如列表)、最大容量、允许类型等作为属性;push 方法不盲目追加,而是先执行判定逻辑:
- 检查是否已满(若设了容量)
- 检查元素类型是否符合预期(如只接受整数)
- 可选:检查是否重复(若需去重栈)
- 满足条件才真正入栈,返回
True;否则返回False或抛出ValueError
用返回值明确表达判定结果
避免静默失败。推荐让 push 返回布尔值,调用方据此处理分支:
<font size="2">if my_stack.push(5):
print("压栈成功")
else:
print("压栈被拒绝:已满或类型不符")</font>
这样比用异常更轻量,适合练习场景;若需严格契约,也可用异常(如 raise OverflowError("栈已满"))。
支持灵活的判定策略(通过参数或子类)
初期可用构造参数控制行为,例如:
-
max_size=5启用容量检查 -
allowed_type=int启用类型检查 -
allow_duplicates=False启用重复检查
进阶可提取判定逻辑为独立策略类(如 CapacityRule、TypeRule),用组合方式注入栈中,体现开闭原则。
示例:带基础判定的栈类
一个简洁可用的实现片段:
<font size="2">class Stack:
def __init__(self, max_size=None, allowed_type=None, allow_duplicates=True):
self._items = []
self._max_size = max_size
self._allowed_type = allowed_type
self._allow_duplicates = allow_duplicates
<pre class="brush:java;toolbar:false;">def push(self, item):
# 容量判定
if self._max_size is not None and len(self._items) >= self._max_size:
return False
# 类型判定
if self._allowed_type is not None and not isinstance(item, self._allowed_type):
return False
# 重复判定
if not self._allow_duplicates and item in self._items:
return False
self._items.append(item)
return True
def pop(self):
return self._items.pop() if self._items else None
这样每次 push 都是一次自洽的“请求-响应”,栈真正拥有了自己的行为边界。











