谁能帮我看看我这个哪里出问题了呀
python课后作业0200. 请编写一个程序,判断给定的字符串 s 中括号的写法是否合法。
条件:
字符串仅包含 '('、')'、'['、']'、'{'、'}' 这三对括号的组合
左右括号必须成对编写,比如 "()" 是合法的,"(" 则是非法的
左右括号必须以正确的顺序闭合,比如 "{()}" 是合法的,"{(})" 则是非法的
x=input('请输入测试字符串:')
n=[]
for i in x:
if i=='('or i==')'or i=='['or i==']'or i=='{'or i=='}':
n.append(i)
if i=='('or'['or'{':
continue
else:
j=n[-1]
if i==')':
if j=='(':
continue
else:
print('非法!')
elif i==']':
if j=='[':
continue
else:
print('非法!')
elif i=='}':
if j=='{':
continue
else:
print('非法!')
else:
if len(x)==len(n) and len(x)%2==0:
print('合法!')
else:
print('非法!')
当你遇到 ) ] } 的时候,列表最后一个 n[-1]总是i(因为你自己刚刚把他添加进列表的)
所以j=n[-1]这句话 j是必定等于 i 的。必定非法
第二点错误就在else下边的逻辑
,假如我字符串是这样的“({{{{}}}}})”你每次遇到后半括号的时候,前边的一个元素不一定非得是牵绊括号,也有可能是后半括号,。所以逻辑有问题
['(','{','{','{','{','','}','}']例如进行到这里,往下来i 是'}',前边一个也是'}'你能说非法吗?
我的想法是这样做,每当遇到前半括号的时候就往列表里添加,遇到后括号的时候就把列表最后一个删除,并且赋给j
这时候再比较i和j是不是一对就完了。
最后如果整段文字都是合法的,列表一定是空的
x = input('请输入测试字符串:')
n = []
result = 1
for i in x:
if i == '(' or i == '[' or i == '{':
n.append(i)
continue
if (i == ')' or i == ']' or i == '}') and n:
j = n.pop()
if i == ')':
if j == '(':
continue
else:
result = 0
break
elif i == ']':
if j == '[':
continue
else:
result = 0
break
elif i == '}':
if j == '{':
continue
else:
result = 0
break
elif (i == ')' or i == ']' or i == '}') and not n:
result = 0
if not n and result:# 最后当列表里没有元素即为[] 逻辑假的时候才是合法的
print('合法')
else:
print('非法')
思路解析
本帖最后由 jackz007 于 2023-2-10 22:51 编辑
d , e , f = {')':'(' , ']' : '[' , '}' : '{'} , [] , False
for c in input('请输入测试字符串:'):
if c in '{[(' :
e . append(c)
elif c in '}])':
if not e or d != e . pop() : break
else:
if not e : f = True
print('合法!') if f else print('非法!') jackz007 发表于 2023-2-10 17:15
请输入测试字符串:}
Traceback (most recent call last):
File "c:\Users\Administrator\Desktop\Python\test\错误代码.py", line 7, in <module>
if d != e . pop():
^^^^^^^^^
IndexError: pop from empty list chinajz 发表于 2023-2-10 18:03
一点疏忽,代码已经修正,请你再测 jackz007 发表于 2023-2-10 17:15
谢谢! 洋洋痒 发表于 2023-2-10 17:11
当你遇到 ) ] } 的时候,列表最后一个 n[-1]总是i(因为你自己刚刚把他添加进列表的)
所以j=n[-1] ...
非常感谢! jackz007 发表于 2023-2-10 20:25
一点疏忽,代码已经修正,请你再测
在集合变量d中将左右封闭符号互为键、值,思路非常巧妙,点赞! 本帖最后由 chinajz 于 2023-2-11 19:25 编辑
测试及运行记录:
#coding=gbk
d , e , f = {')' : '(' , ']' : '[' , '}' : '{'} , [] , False
#变量d集合中,将左右封闭符号互为键、值;e=[] ;f=False
print("d=",d)
for x in d:
print(f"d['{x}'] = ",d,end = "~~~")
print()
for c in '{[{{((({})))}}]}':
if c in '{[(' :#判断是否为左边符号
e . append(c)#增加左边符号记录
print(c," +++",e)
elif c in '}])': #右边符号判断
print(c," ---",e)
if not e or d != e . pop():#e删除未尾符号,如果未尾符号与当前符号(左边)不匹配结束当前进程
break
else:#如果for循环正常结束,else中语句执行。如果是break的,则不执行。
#if not e :#如果没有左边符号也没有右边符号
print(" ***",e)
f = True
print()
print('合法!') if f else print('非法!')
运行结果:
d= {')': '(', ']': '[', '}': '{'}
d[')'] =(~~~d[']'] =[~~~d['}'] ={~~~
{+++ ['{']
[+++ ['{', '[']
{+++ ['{', '[', '{']
{+++ ['{', '[', '{', '{']
(+++ ['{', '[', '{', '{', '(']
(+++ ['{', '[', '{', '{', '(', '(']
(+++ ['{', '[', '{', '{', '(', '(', '(']
{+++ ['{', '[', '{', '{', '(', '(', '(', '{']
}--- ['{', '[', '{', '{', '(', '(', '(', '{']
)--- ['{', '[', '{', '{', '(', '(', '(']
)--- ['{', '[', '{', '{', '(', '(']
)--- ['{', '[', '{', '{', '(']
}--- ['{', '[', '{', '{']
}--- ['{', '[', '{']
]--- ['{', '[']
}--- ['{']
*** []
合法!
页:
[1]