洛飘 发表于 2024-4-23 11:21:15

还有什么其他办法没

s = input("请录入测试字符串:")
left =[]
temp = []

for i in s:
    if i == "(" or i == "[" or i == "{":
      left.append(i)
    elif len(left) == 0:
      print("非法")
      break
    elif i == ")" or i == "]" or i == "}":
      temp = left[-1] + i
      if temp == "()" or temp == "[]" or temp == "{}":
                left.pop()
    else:
      print("非法")
      break
else:
    if len(left) == 0:
      print("合法")
    else:
      print("非法")

其中:
elif len(left) == 0:
      print("非法")
      break
这一块,放在   temp = left[-1] + i 之后会报错
放在现在的位置,看着可恶心,还有别的办法嘛

FishC 发表于 2024-4-23 11:21:35

根据你提供的代码,我看到你的问题在于当temp等于空时(即左括号与右括号匹配成功),你尝试使用left.pop()来移除已匹配的左括号。但是,left是一个空列表,pop方法无法使用。

为了解决这个问题,你可以使用一个计数器变量来记录左括号的数量。每当遇到左括号时,计数器加1;每当遇到右括号时,计数器减1。这样,当你检查完所有字符后,如果计数器为0,就说明所有左括号都匹配成功,字符串合法。否则,左括号数量大于0或小于0,字符串非法。

下面是修改后的代码:

s = input("请录入测试字符串:")
count = 0

for i in s:
    if i == "(" or i == "{":
      count += 1
    elif i == ")" or i == "}":
      count -= 1
      if count < 0:# 如果有右括号多余左括号,直接跳出循环
            print("非法")
            break

if count == 0:
    print("合法")
elif count > 0:
    print("非法,左括号缺失")
else:
    print("非法,右括号缺失")

这样修改后的代码只需要遍历一次字符串,不需要使用额外的列表,也不需要使用temp变量。希望对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-5-4 11:27:06

d , e , f = [] , {')' : '(' , ']' : '[' , '}' : '{'} , False
s = input('请输入测试字符串:')
if s :
    for x in s :
      if x in e . keys() or x in e . values() :
            if x in e . values() :
                d . append(x)
            else :
                if d and d[-1] == e :
                  d . pop()
                else :
                  break
    else :
      if not d :
            f = True
    print('合法') if f else print('非法')
页: [1]
查看完整版本: 还有什么其他办法没