星雨幽幽 发表于 2025-9-10 14:28:27

确定括号是否合法的编程题是否可以这样写

第020讲:列表(II)| 课后测试题及答案,最后的编程题让判断括号的写法是否合法,我是否可以这样写代码
import sys
num1=['(','[','{']
num2=[')',']','}']
num=[]
a=input('请输入测试字段:')
num.extend(a)
x=num[::-1]
n=len(a)
i=0
for w in num[:n//2]:
    for y in num2:
      if w==y:
            print('非法')
            sys.exit()
while i<n/2:      
    if num1.index(num)==num2.index(x):
      i=i+1
    else:
      print('非法')
      break
else:
    print('合法')

FishC 发表于 2025-9-10 14:29:30

您好!关于判断括号是否合法的编程题,您提供的代码有一些语法错误和逻辑问题,让我来帮您分析一下。

首先,您的代码中:
- num1= 和 num= 没有赋值,这会导致错误。
- num2=','}'] 的写法不正确,可能是想定义 closing brackets,但语法错了。
- 逻辑上,您的代码只检查了是否有特定字符(如逗号、右花括号等),但括号匹配需要检查 opening 和 closing brackets 是否成对出现,例如 '()'、'{}'、'[]'。

一个更好的方法是使用栈(stack)来检查括号匹配。以下是正确的代码示例:


def is_valid_brackets(s):
    stack = []
    mapping = {')': '(', '}': '{', ']': '['}
    for char in s:
      if char in mapping.values():# 如果是 opening bracket
            stack.append(char)
      elif char in mapping.keys():# 如果是 closing bracket
            if not stack or stack.pop() != mapping:
                return False
    return not stack

# 测试代码
input_str = input('请输入测试字符串:')
if is_valid_brackets(input_str):
    print('合法')
else:
    print('非法')


这个代码:
- 使用一个栈来跟踪 opening brackets。
- 定义一个映射关系,用于匹配 closing bracket 到对应的 opening bracket。
- 遍历字符串,处理每个字符。
- 最后检查栈是否为空。

您的原始代码需要修正语法错误并改进逻辑。希望这能帮到您!如果还有其他问题,请随时问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

星雨幽幽 发表于 2025-9-10 14:40:00

我改了以下代码,这样可以满足题目要求吗
import sys
num1=['(','[','{']
num2=[')',']','}']
num=[]
a=input('请输入测试字段:')
num.extend(a)
x=num[::-1]
n=len(a)
i=0
if len(a)%2!=0:
    print('非法')
    sys.exit()
for w in num[:n//2]:
    for y in num2:
      if w==y:
            print('非法')
            sys.exit()
    for z in num1:
      if w!=z:
            print('非法')
            sys.exit()
while i<n/2:      
    if num1.index(num)==num2.index(x):
      i=i+1
    else:
      print('非法')
      break
else:
    print('合法')
   

FishC 发表于 2025-9-10 14:40:42

星雨幽幽 发表于 2025-09-10 14:40
我改了以下代码,这样可以满足题目要求吗
import sys ...

您好!我看到您修改了代码,但很抱歉,您的代码仍然存在一些语法错误和逻辑问题,无法正确判断括号是否合法。

让我来帮您分析一下:

主要问题:
1. num1=['(',' - 这里缺少右括号,字符串未闭合
2. num2=',','}','] - 这里也缺少右括号
3. num= - 这里没有赋值,会导致错误
4. 逻辑上只检查长度是否为偶数和是否有特定字符,但括号匹配需要更复杂的检查

推荐的正确写法:

def is_valid_brackets(s):
    stack = []
    mapping = {')': '(', '}': '{', ']': '['}
   
    for char in s:
      if char in ['(', '{', '[']:# 如果是开括号
            stack.append(char)
      elif char in [')', '}', ']']:# 如果是闭括号
            if not stack or stack.pop() != mapping:
                return False
   
    return not stack# 如果栈为空,说明所有括号都匹配

# 主程序
a = input('请输入测试字符串:')
if is_valid_brackets(a):
    print('合法')
else:
    print('非法')

这个算法的原理:
1. 使用栈来跟踪开括号
2. 遇到开括号时压入栈中
3. 遇到闭括号时,检查栈顶元素是否与之匹配
4. 最后检查栈是否为空(所有开括号都有对应的闭括号)

测试示例:
- ()[]{} → 合法
- ({}) → 合法
- ([]) → 合法
- ([)] → 非法
- ((()) → 非法

希望这个解答能帮到您!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 2025-9-10 15:15:15

宝子,这么写不太行!

代码把字符串“按中心对称”去比对,比如把左半部分和右半部分反向一一对应。

这会把很多本来合法的括号串判成非法,如:()[]、[()]{}{}。合法的括号序列并不要求字符逐位镜像,只要求入栈先开、出栈后闭、类型匹配。

另外还存在几点问题:


[*]while i<n/2 用了浮点比较;应为 n//2。
[*]若输入包含非括号字符,index 会抛错或误判。
[*]双层循环 + sys.exit() 可读性与性能都不佳。
[*]未提前过滤奇数长度。

修改一下:

def is_valid_brackets(s: str) -> bool:
    pairs = {')': '(', ']': '[', '}': '{'}
    opens = set(pairs.values())
    stack = []

    for ch in s:
      if ch in opens:
            stack.append(ch)
      elif ch in pairs:                  # 是右括号
            if not stack or stack.pop() != pairs:
                return False
      else:
            # 若不允许其他字符,直接 False;若允许则跳过
            return False
    return not stack

if __name__ == "__main__":
    s = input("请输入测试字段:")
    print("合法" if is_valid_brackets(s) else "非法")
遇到左括号入栈,遇到右括号必须与“最近未匹配”的左括号类型一致。

能正确处理 ()[]、([{}])、([)]、空串等;奇数长度最终会因栈非空或类型不匹配返回 False。
页: [1]
查看完整版本: 确定括号是否合法的编程题是否可以这样写