栈实现镜像字符串检测示例代码的逻辑错误确认问询
栈实现镜像串检测的逻辑问题分析
我在数据结构课程中学习栈相关内容时,需要改造一段用栈检测字符串是否为镜像串(如abcmcba)的示例代码,使其返回具体失败原因(如字符不匹配、无效字符、两侧长度不等)而非仅布尔值。改造后我发现原示例代码存在逻辑问题:
原代码的最终判断语句if not (i == n and stack.is_empty()):会在字符不匹配的场景下误触发。当上方循环因字符不匹配停止执行时,i未遍历完字符串且栈未弹空,此时该语句会将结果覆盖为「两侧长度不匹配」,但实际两侧长度相等。
我改写后的代码在输入字符不匹配的字符串(如abmcb)时,会出现具体错误被覆盖的情况。请问我的判断是否正确?
原示例代码
from Stack_array import Stack MIRROR = "m" CHARS = "abc" def is_mirror(string): mirror = True stack = Stack() n = len(string) i = 0 # 将镜像字符左侧的有效字符压入栈 while i < n and string[i] != MIRROR: if string[i] in CHARS: stack.push(string[i]) i += 1 else: mirror = False # 跳过镜像字符 i += 1 # 弹出栈顶字符与右侧字符对比 while mirror and i < n and not stack.is_empty(): c = stack.pop() if string[i] != c: mirror = False else: i += 1 # 检查最终状态:判断两侧长度是否匹配 if not (i == n and stack.is_empty()): mirror = False return mirror
改写后的代码
from Stack_array import Stack MIRROR = "m" CHARS = "abc" def is_mirror(string): mirror = True stack = Stack() n = len(string) i = 0 # 将镜像字符左侧的有效字符压入栈 while i < n and string[i] != MIRROR: if string[i] in CHARS: stack.push(string[i]) i += 1 else: mirror = "Invalid char" # 跳过镜像字符 i += 1 # 弹出栈顶字符与右侧字符对比 while mirror and i < n and not stack.is_empty(): c = stack.pop() if string[i] != c: mirror = "Side character mismatch" else: i += 1 # 检查最终状态:判断两侧长度是否匹配 if not (i == n and stack.is_empty()): mirror = "Side length mismatch" return mirror
你的判断完全正确。
原代码的核心问题在于,最终判断语句没有考虑mirror的当前状态——只要i未遍历完字符串或栈不为空,就直接将mirror设为False,完全覆盖了之前可能已经出现的字符不匹配错误。
放到你改写后的代码中,以输入abmcb为例:
- 左侧字符
a、b被压入栈,i移动到2(对应镜像字符m); - 跳过
m后i变为3; - 进入对比循环,弹出
b与string[3]的c对比,不匹配,mirror被设为Side character mismatch; - 循环终止,但后续的最终判断发现
i=4(未到字符串末尾n=5)且栈中还有a未弹出,于是直接将mirror覆盖为Side length mismatch,导致真实错误被掩盖。
要解决这个问题,只需在执行最终判断前先检查mirror是否已经是错误状态,只有当mirror仍为True时,才检查长度匹配问题:
# 仅在未检测到其他错误时,才检查长度匹配问题 if mirror and not (i == n and stack.is_empty()): mirror = "Side length mismatch"
这样就能保证返回的是最先出现的错误原因,避免覆盖问题。
内容的提问来源于stack exchange,提问作者ATR2400
相关产品推荐
相关产品推荐

