Gigi233 发表于 2023-2-10 13:31:52

谁能帮我看看我这个哪里出问题了呀

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('非法')

思路解析

jackz007 发表于 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 != e . pop() : break
else:
    if not e : f = True
print('合法!') if f else print('非法!')

chinajz 发表于 2023-2-10 18:03:38

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

jackz007 发表于 2023-2-10 20:25:08

chinajz 发表于 2023-2-10 18:03


       一点疏忽,代码已经修正,请你再测

Gigi233 发表于 2023-2-10 23:09:23

jackz007 发表于 2023-2-10 17:15


谢谢!

Gigi233 发表于 2023-2-10 23:10:15

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

非常感谢!

chinajz 发表于 2023-2-11 08:24:57

jackz007 发表于 2023-2-10 20:25
一点疏忽,代码已经修正,请你再测

在集合变量d中将左右封闭符号互为键、值,思路非常巧妙,点赞!

chinajz 发表于 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,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]
查看完整版本: 谁能帮我看看我这个哪里出问题了呀