鱼C论坛

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

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

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

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

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

x
python课后作业020

0. 请编写一个程序,判断给定的字符串 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('非法!')
    
最佳答案
2023-2-10 17:11:05
当你遇到 ) ] } 的时候,列表最后一个 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('非法')

思路解析

12112.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-10 17:11:05 | 显示全部楼层    本楼为最佳答案   
当你遇到 ) ] } 的时候,列表最后一个 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('非法')

思路解析

12112.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-10 17:15:26 | 显示全部楼层
本帖最后由 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[c] != e . pop() : break
else:
    if not e : f = True
print('合法!') if f else print('非法!')

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-10 18:03:38 | 显示全部楼层
请输入测试字符串:}
Traceback (most recent call last):
  File "c:\Users\Administrator\Desktop\Python\test\错误代码.py", line 7, in <module>
    if d[c] != e . pop():
               ^^^^^^^^^
IndexError: pop from empty list
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


       一点疏忽,代码已经修正,请你再测
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-10 23:09:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


在集合变量d中将左右封闭符号互为键、值,思路非常巧妙,点赞!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-11 19:13:05 | 显示全部楼层
本帖最后由 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[x],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[c] != 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['}'] =  {  ~~~  
{  +++ ['{']
[  +++ ['{', '[']
{  +++ ['{', '[', '{']
{  +++ ['{', '[', '{', '{']
(  +++ ['{', '[', '{', '{', '(']
(  +++ ['{', '[', '{', '{', '(', '(']
(  +++ ['{', '[', '{', '{', '(', '(', '(']
{  +++ ['{', '[', '{', '{', '(', '(', '(', '{']
}  --- ['{', '[', '{', '{', '(', '(', '(', '{']
)  --- ['{', '[', '{', '{', '(', '(', '(']
)  --- ['{', '[', '{', '{', '(', '(']
)  --- ['{', '[', '{', '{', '(']
}  --- ['{', '[', '{', '{']
}  --- ['{', '[', '{']
]  --- ['{', '[']
}  --- ['{']
   *** []

合法!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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