求解惑
s = input("请输入测试字符串:")stack = []
for c in s:
if c == '(' or c == '[' or c == '{':
stack.append(c)
else:
if len(stack) == 0:
print("非法T_T")
break
if c == ')':
d = '('
elif c == ']':
d = '['
elif c == '}':
d = '{'
if d != stack.pop():
print("非法T_T")
break
else:
if len(stack) == 0:
print("合法^o^")
else:
print("非法T_T")
问一下大家这个代码判断'()'时它前面把'('弄到列表里然后怎么判断')'啊?为什么最后说len(stack) == 0时是合法?前边列表里不是有一个'('吗?而且还有一个')'没判断...代码是正确的{:10_286:} 本帖最后由 isdkz 于 2022-2-25 09:59 编辑
你的代码有点问题
if c == ')':
d = '('
elif c == ']':
d = '['
elif c == '}':
d = '{'
if d != stack.pop():
print("非法T_T")
break
这一部分,在不满足上面的条件语句的情况下,d 不会被赋值,可你在后面对 d 进行了判断,
d 没有定义的情况下就会报错
你如果是想判断以括号为边界,括号里面不为空的字符串没必要那么麻烦
s = input("请输入测试字符串:")
if s + s[-1] in {'()', '[]', '{}'} and s:
print("合法^o^")
else:
print("非法T_T")
我觉得可以直接在:
s = input("请输入测试字符串:")
stack = []
for c in s:
if c == '(' or c == '[' or c == '{':
stack.append(c)
else:
if len(stack) == 0:
print("非法T_T")
break
if c == ')':
d = '('
elif c == ']':
d = '['
elif c == '}':
d = '{'
if d != stack.pop():
print("非法T_T")
break
else:
if len(stack) == 0:
print("合法^o^")
else:
print("非法T_T")
中的第 8 行:
else:
下面加一条:
d = None
就好了 isdkz 发表于 2022-2-25 00:03
你的代码有点问题
这一部分,在不满足上面的条件语句的情况下,d 不会被赋值,可你在后面对 d 进行了判 ...
如果不满足条件的话d会被定义为!=stack.pop(),所以最后会打印"非法",您可以自己打代码试一下{:10_311:} I-am刘sir 发表于 2022-2-25 21:20
如果不满足条件的话d会被定义为!=stack.pop(),所以最后会打印"非法",您可以自己打代码试一下
我已经试过了,首先你的 d 除了那个条件语句没有其它赋值的地方,
那如果你的条件语句里面的所有条件都不满足,d 就没有被赋值,那下面用 d 来做判断肯定是会报 NameError 的 brackets = {'(': ')', '[': ']', '{': '}'}
string = input("请输入测试字符串:")
arr = []
for n, s in enumerate(string):
if not n and s in brackets.values():
print("非法")
break
elif s in brackets.keys(): arr.append(s)
elif s in brackets.values():
if brackets] != s:
print("非法")
break
else: arr.pop()
else:
print("合法")请输入测试字符串:(()())
合法
请输入测试字符串:((])([))
非法
请输入测试字符串:([)]
非法
请输入测试字符串:({}[]())[]
合法 你那个代码如果括号里面没有内容的话是可以的。
第一个问题:
把括号 append 到列表里是一个入栈的过程,pop 是一个出栈的过程,
栈是后进先出的,
一旦碰到右括号,就把列表里面的元素出栈,
因为栈里面的元素都是左括号,遇到右括号的时候最先出栈的肯定是离它最近的左括号,
if d != stack.pop() 如果离它最近的左括号不是它相对应的左括号,输出非法
第二个问题:
if len(stack) == 0 也就是说当遍历完了所有的括号,
还有左括号没出栈的话,也就是说这个左括号没有相对应的右括号,所以就非法
第三个问题:
如果所有的右括号都有对应的左括号的话,列表肯定是空的,
因为遇到右括号的时候就把最后加进列表的左括号(也就是离这个右括号最近的左括号)给弹出列表了
页:
[1]