鱼C论坛

 找回密码
 立即注册
查看: 3476|回复: 8

[已解决]谁能帮我看看我这个哪里出问题了呀

[复制链接]
发表于 2023-2-10 13:31:52 | 显示全部楼层 |阅读模式

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

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

x
python课后作业020

0. 请编写一个程序,判断给定的字符串 s 中括号的写法是否合法。

条件:

字符串仅包含 '('、')'、'['、']'、'{'、'}' 这三对括号的组合
左右括号必须成对编写,比如 "()" 是合法的,"(" 则是非法的
左右括号必须以正确的顺序闭合,比如 "{()}" 是合法的,"{(})" 则是非法的


  1. x=input('请输入测试字符串:')
  2. n=[]
  3. for i in x:
  4.     if i=='('or i==')'or i=='['or i==']'or i=='{'or i=='}':
  5.         n.append(i)
  6.         if i=='('or'['or'{':
  7.             continue
  8.         else:
  9.             j=n[-1]
  10.             if i==')':
  11.                 if j=='(':
  12.                     continue
  13.                 else:
  14.                     print('非法!')
  15.             elif i==']':
  16.                 if j=='[':
  17.                     continue
  18.                 else:
  19.                     print('非法!')
  20.             elif i=='}':
  21.                 if j=='{':
  22.                     continue
  23.                 else:
  24.                     print('非法!')
  25.                     
  26.     else:
  27.         if len(x)==len(n) and len(x)%2==0:
  28.             print('合法!')
  29.         else:
  30.             print('非法!')
  31.    
复制代码
最佳答案
2023-2-10 17:11:05
当你遇到 ) ] } 的时候,列表最后一个 n[-1]  总是  i  (因为你自己刚刚把他添加进列表的)
所以j=n[-1]这句话 j是必定等于 i 的。必定非法
第二点错误就在else下边的逻辑
,假如我字符串是这样的“({{{{}}}}})”你每次遇到后半括号的时候,前边的一个元素不一定非得是牵绊括号,也有可能是后半括号,。所以逻辑有问题
['(','{','{','{','{','','}','}']例如进行到这里,往下来  i 是'}',前边一个也是'}'你能说非法吗?



我的想法是这样做,每当遇到前半括号的时候就往列表里添加,遇到后括号的时候就把列表最后一个删除,并且赋给j
这时候再比较i和j是不是一对就完了。
最后如果整段文字都是合法的,列表一定是空的

  1. x = input('请输入测试字符串:')
  2. n = []
  3. result = 1
  4. for i in x:
  5.     if i == '(' or i == '[' or i == '{':
  6.         n.append(i)
  7.         continue
  8.     if (i == ')' or i == ']' or i == '}') and n:
  9.         j = n.pop()
  10.         if i == ')':
  11.             if j == '(':
  12.                 continue
  13.             else:
  14.                 result = 0
  15.                 break
  16.         elif i == ']':
  17.             if j == '[':
  18.                 continue
  19.             else:
  20.                 result = 0
  21.                 break
  22.         elif i == '}':
  23.             if j == '{':
  24.                 continue
  25.             else:
  26.                 result = 0
  27.                 break
  28.     elif (i == ')' or i == ']' or i == '}') and not n:
  29.         result = 0

  30. if not n and result:  # 最后当列表里没有元素即为[] 逻辑假的时候才是合法的
  31.     print('合法')
  32. else:
  33.     print('非法')
复制代码


思路解析

12112.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-10 17:11:05 | 显示全部楼层    本楼为最佳答案   
当你遇到 ) ] } 的时候,列表最后一个 n[-1]  总是  i  (因为你自己刚刚把他添加进列表的)
所以j=n[-1]这句话 j是必定等于 i 的。必定非法
第二点错误就在else下边的逻辑
,假如我字符串是这样的“({{{{}}}}})”你每次遇到后半括号的时候,前边的一个元素不一定非得是牵绊括号,也有可能是后半括号,。所以逻辑有问题
['(','{','{','{','{','','}','}']例如进行到这里,往下来  i 是'}',前边一个也是'}'你能说非法吗?



我的想法是这样做,每当遇到前半括号的时候就往列表里添加,遇到后括号的时候就把列表最后一个删除,并且赋给j
这时候再比较i和j是不是一对就完了。
最后如果整段文字都是合法的,列表一定是空的

  1. x = input('请输入测试字符串:')
  2. n = []
  3. result = 1
  4. for i in x:
  5.     if i == '(' or i == '[' or i == '{':
  6.         n.append(i)
  7.         continue
  8.     if (i == ')' or i == ']' or i == '}') and n:
  9.         j = n.pop()
  10.         if i == ')':
  11.             if j == '(':
  12.                 continue
  13.             else:
  14.                 result = 0
  15.                 break
  16.         elif i == ']':
  17.             if j == '[':
  18.                 continue
  19.             else:
  20.                 result = 0
  21.                 break
  22.         elif i == '}':
  23.             if j == '{':
  24.                 continue
  25.             else:
  26.                 result = 0
  27.                 break
  28.     elif (i == ')' or i == ']' or i == '}') and not n:
  29.         result = 0

  30. if not n and result:  # 最后当列表里没有元素即为[] 逻辑假的时候才是合法的
  31.     print('合法')
  32. else:
  33.     print('非法')
复制代码


思路解析

12112.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-10 17:15:26 | 显示全部楼层
本帖最后由 jackz007 于 2023-2-10 22:51 编辑
  1. d , e , f = {')':'(' , ']' : '[' , '}' : '{'} , [] , False
  2. for c in input('请输入测试字符串:'):
  3.     if c in '{[(' :
  4.         e . append(c)
  5.     elif c in '}])':
  6.         if not e or d[c] != e . pop() : break
  7. else:
  8.     if not e : f = True
  9. print('合法!') if f else print('非法!')
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
chinajz + 1 + 1 感谢楼主无私奉献!左右封闭符号互为键、值

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-10 18:03:38 | 显示全部楼层
  1. 请输入测试字符串:}
  2. Traceback (most recent call last):
  3.   File "c:\Users\Administrator\Desktop\Python\test\错误代码.py", line 7, in <module>
  4.     if d[c] != e . pop():
  5.                ^^^^^^^^^
  6. IndexError: pop from empty list
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-10 20:25:08 | 显示全部楼层


       一点疏忽,代码已经修正,请你再测
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-10 23:09:23 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-10 23:10:15 | 显示全部楼层
洋洋痒 发表于 2023-2-10 17:11
当你遇到 ) ] } 的时候,列表最后一个 n[-1]  总是  i  (因为你自己刚刚把他添加进列表的)
所以j=n[-1] ...

非常感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 08:24:57 | 显示全部楼层
jackz007 发表于 2023-2-10 20:25
一点疏忽,代码已经修正,请你再测


在集合变量d中将左右封闭符号互为键、值,思路非常巧妙,点赞!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 19:13:05 | 显示全部楼层
本帖最后由 chinajz 于 2023-2-11 19:25 编辑

测试及运行记录:
  1. #coding=gbk
  2. d , e , f = {')' : '(' , ']' : '[' , '}' : '{'} , [] , False
  3. #变量d集合中,将左右封闭符号互为键、值;e=[] ;f=False
  4. print("d=",d)
  5. for x in d:
  6.     print(f"d['{x}'] = ",d[x],end = "  ~~~  ")
  7. print()
  8. for c in '{[{{((({})))}}]}':
  9.    
  10.     if c in '{[(' :#判断是否为左边符号
  11.         e . append(c)#增加左边符号记录
  12.         print(c," +++",e)
  13.     elif c in '}])': #右边符号判断
  14.       
  15.         print(c," ---",e)
  16.         if not e or d[c] != e . pop():#e删除未尾符号,如果未尾符号与当前符号(左边)不匹配结束当前进程
  17.             break
  18. else:#如果for循环正常结束,else中语句执行。如果是break的,则不执行。
  19.    
  20.     #if not e :#如果没有左边符号也没有右边符号
  21.     print("   ***",e)
  22.     f = True
  23. print()
  24. print('合法!') if f else print('非法!')
复制代码

运行结果:
  1. d= {')': '(', ']': '[', '}': '{'}
  2. d[')'] =  (  ~~~  d[']'] =  [  ~~~  d['}'] =  {  ~~~  
  3. {  +++ ['{']
  4. [  +++ ['{', '[']
  5. {  +++ ['{', '[', '{']
  6. {  +++ ['{', '[', '{', '{']
  7. (  +++ ['{', '[', '{', '{', '(']
  8. (  +++ ['{', '[', '{', '{', '(', '(']
  9. (  +++ ['{', '[', '{', '{', '(', '(', '(']
  10. {  +++ ['{', '[', '{', '{', '(', '(', '(', '{']
  11. }  --- ['{', '[', '{', '{', '(', '(', '(', '{']
  12. )  --- ['{', '[', '{', '{', '(', '(', '(']
  13. )  --- ['{', '[', '{', '{', '(', '(']
  14. )  --- ['{', '[', '{', '{', '(']
  15. }  --- ['{', '[', '{', '{']
  16. }  --- ['{', '[', '{']
  17. ]  --- ['{', '[']
  18. }  --- ['{']
  19.    *** []

  20. 合法!
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 00:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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