确定括号是否合法的编程题是否可以这样写
第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('合法') 您好!关于判断括号是否合法的编程题,您提供的代码有一些语法错误和逻辑问题,让我来帮您分析一下。
首先,您的代码中:
- 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 小助理,如未能正确解答您的问题,请继续追问。 我改了以下代码,这样可以满足题目要求吗
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('合法')
星雨幽幽 发表于 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 小助理,如未能正确解答您的问题,请继续追问。 宝子,这么写不太行!
代码把字符串“按中心对称”去比对,比如把左半部分和右半部分反向一一对应。
这会把很多本来合法的括号串判成非法,如:()[]、[()]{}{}。合法的括号序列并不要求字符逐位镜像,只要求入栈先开、出栈后闭、类型匹配。
另外还存在几点问题:
[*]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]