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') 问题的核心是:你在遍历 string_list 的同时,又修改了 string_list。
自己尝试修改一下吧? 你的代码主要有这几个问题:
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]