You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

栈实现镜像字符串检测示例代码的逻辑错误确认问询

栈实现镜像串检测的逻辑问题分析

我在数据结构课程中学习栈相关内容时,需要改造一段用栈检测字符串是否为镜像串(如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为例:

  1. 左侧字符a、b被压入栈,i移动到2(对应镜像字符m);
  2. 跳过m后i变为3;
  3. 进入对比循环,弹出b与string[3]的c对比,不匹配,mirror被设为Side character mismatch;
  4. 循环终止,但后续的最终判断发现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:45:23