11063216906 发表于 2026-10-1 20:30:32

python最新版20讲作业

求问大佬这个代码的问题在哪 我的for循环只执行一次 而且结果也不对




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

条件:

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






string = input("输入测试字符串:")
string_list = [ ]
string_list.extend(string)
list_temp = [ ]
r = ''
index = 0
for i in string_list:
    print(i)
    if (i == '{') or (i == '(' )or (i == '['):
      list_temp.append(string_list.pop(index))
    else:
      if len(list_temp) == 0:
            print("illegal2!")
            break
      if i == '}':
            r = '{'
      if i == ']':
            r = '['
      if i == ')':
            r = '('

      if list_temp.pop() != r:
            print(i)
            print(r)
            print(test1)
            print('illegal3!')
            break
    index += 1


print('end')

小甲鱼的二师兄 发表于 2026-10-1 20:30:33

问题的核心是:你在遍历 string_list 的同时,又修改了 string_list。

自己尝试修改一下吧?

FishC 发表于 2026-10-1 20:30:46

你的代码主要有这几个问题:

1. list_temp 一直是空列表,没有压入任何东西,第一次执行 list_temp.pop() 就会报错,所以循环只走一次。
2. pop() 不能每次循环都执行,应该只在遇到右括号时执行。
3. 括号映射反了:遇到左括号应该把对应的右括号压入栈,而不是只赋值给 r。
4. 循环结束后还要检查栈是否为空,栈不为空说明有左括号没闭合。

正确思路:用列表当栈。遇到左括号,把对应的右括号压栈;遇到右括号,先判断栈是否为空,再弹出栈顶比较是否相同;最后栈为空才合法。

参考代码:


s = input("输入测试字符串:")
stack = []
pairs = {'(': ')', '[': ']', '{': '}'}
ok = True

for ch in s:
    if ch in pairs:            # 左括号
      stack.append(pairs)
    elif ch in ')]}':            # 右括号
      if not stack or stack.pop() != ch:
            ok = False
            break

if ok and not stack:
    print("合法")
else:
    print("非法")


另外,在论坛贴代码时最好用 包起来,否则方括号 [ ] 会被论坛当成标签解析掉,比如 [] 可能就显示不出来。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: python最新版20讲作业