鱼C论坛

 找回密码
 立即注册
查看: 135|回复: 4

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

[复制链接]
发表于 2025-9-10 14:28:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第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[i])==num2.index(x[i]):
        i=i+1
    else:
        print('非法')
        break
else:
    print('合法')
判断括号合法.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-9-10 14:29:30 | 显示全部楼层
您好!关于判断括号是否合法的编程题,您提供的代码有一些语法错误和逻辑问题,让我来帮您分析一下。

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

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


  1. def is_valid_brackets(s):
  2.     stack = []
  3.     mapping = {')': '(', '}': '{', ']': '['}
  4.     for char in s:
  5.         if char in mapping.values():  # 如果是 opening bracket
  6.             stack.append(char)
  7.         elif char in mapping.keys():  # 如果是 closing bracket
  8.             if not stack or stack.pop() != mapping[char]:
  9.                 return False
  10.     return not stack

  11. # 测试代码
  12. input_str = input('请输入测试字符串:')
  13. if is_valid_brackets(input_str):
  14.     print('合法')
  15. else:
  16.     print('非法')
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[i])==num2.index(x[i]):
        i=i+1
    else:
        print('非法')
        break
else:
    print('合法')
   
判断括号是否合法2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[char]:
                return False
   
    return not stack  # 如果栈为空,说明所有括号都匹配

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-9-10 15:15:15 | 显示全部楼层
宝子,这么写不太行!

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

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

另外还存在几点问题:

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

修改一下:

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

  5.     for ch in s:
  6.         if ch in opens:
  7.             stack.append(ch)
  8.         elif ch in pairs:                    # 是右括号
  9.             if not stack or stack.pop() != pairs[ch]:
  10.                 return False
  11.         else:
  12.             # 若不允许其他字符,直接 False;若允许则跳过
  13.             return False
  14.     return not stack

  15. if __name__ == "__main__":
  16.     s = input("请输入测试字段:")
  17.     print("合法" if is_valid_brackets(s) else "非法")
复制代码

遇到左括号入栈,遇到右括号必须与“最近未匹配”的左括号类型一致。

能正确处理 ()[]、([{}])、([)]、空串等;奇数长度最终会因栈非空或类型不匹配返回 False。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-1 06:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表