I-am刘sir 发表于 2022-2-24 23:06:57

求解惑

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 00:03:50

本帖最后由 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")

python爱好者. 发表于 2022-2-25 11:22:39

我觉得可以直接在:
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
就好了

I-am刘sir 发表于 2022-2-25 21:20:54

isdkz 发表于 2022-2-25 00:03
你的代码有点问题

这一部分,在不满足上面的条件语句的情况下,d 不会被赋值,可你在后面对 d 进行了判 ...

如果不满足条件的话d会被定义为!=stack.pop(),所以最后会打印"非法",您可以自己打代码试一下{:10_311:}

isdkz 发表于 2022-2-25 21:25:30

I-am刘sir 发表于 2022-2-25 21:20
如果不满足条件的话d会被定义为!=stack.pop(),所以最后会打印"非法",您可以自己打代码试一下

我已经试过了,首先你的 d 除了那个条件语句没有其它赋值的地方,

那如果你的条件语句里面的所有条件都不满足,d 就没有被赋值,那下面用 d 来做判断肯定是会报 NameError 的

傻眼貓咪 发表于 2022-2-25 22:39:18

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("合法")请输入测试字符串:(()())
合法

请输入测试字符串:((])([))
非法

请输入测试字符串:([)]
非法

请输入测试字符串:({}[]())[]
合法

isdkz 发表于 2022-2-26 09:37:25

你那个代码如果括号里面没有内容的话是可以的。

第一个问题:

把括号 append 到列表里是一个入栈的过程,pop 是一个出栈的过程,

栈是后进先出的,

一旦碰到右括号,就把列表里面的元素出栈,

因为栈里面的元素都是左括号,遇到右括号的时候最先出栈的肯定是离它最近的左括号,

if d != stack.pop() 如果离它最近的左括号不是它相对应的左括号,输出非法

第二个问题:

if len(stack) == 0 也就是说当遍历完了所有的括号,

还有左括号没出栈的话,也就是说这个左括号没有相对应的右括号,所以就非法

第三个问题:

如果所有的右括号都有对应的左括号的话,列表肯定是空的,

因为遇到右括号的时候就把最后加进列表的左括号(也就是离这个右括号最近的左括号)给弹出列表了
页: [1]
查看完整版本: 求解惑