python中stack()_在python中使用stack检查括号是否平衡

你的代码有一些问题。首先,有几件事我想说:如果符号字符串不是以左括号开头,则代码将抛出错误。这是因为您在第一个if语句中初始化了new_bracket。这将导致问题,因为如果第一个字符不是左括号,它将尝试在elif语句中调用new_bracket,并且由于它尚未初始化,它将引发一个UnboundLocalError。这可以用elif symbol in [')', ']', '}']: return False来修复。因为以右括号开头显然意味着它的不平衡,这是有意义的,并防止程序在未初始化的情况下调用new_bracket。在

使用j变量是没有用的,因为您永远不会在if语句的范围之外使用它。您可以使用i。在

如果list.pop(i)超出brackets_stack的范围,则使用list.pop(i)可能会导致错误。您不需要索引,因为您希望符号位于堆栈的末尾,而这正是list.pop()自动执行的操作。在

elif len(brackets_stack) == 0:不应在for循环内。这应该在循环之外,因为您只想在处理完所有文本之后说success。在

new_bracket = Bracket(brackets_stack[j], j)在许多方面都是错误的。第一个是你不想用brackets_stack[j]来做一个新的符号,你想用text[j]或者更好的symbol来制作一个新的符号。另一个原因是,只有在看到新的左括号时才会更改此设置。但是,如果找到与该括号匹配的变量,因为您从未更改此变量,它将保持与前一个括号相同的位置。您应该重新声明您的new_bracket的符号应该是什么。这个名字本身就有误导性,下面就改了。在

考虑到所有这些,下面是一个您想做什么的修订版本,封装在一个函数中。有些东西你也需要添加到你的班级。在class Bracket:

def __init__(self, bracket_type, position):

self.bracket_type = bracket_type

self.position = position

def Match(self, c):

if self.bracket_type: //handles empty bracket_type

if self.bracket_type == '[' and c == ']':

return True

if self.bracket_type == '{' and c == '}':

return True

if self.bracket_type == '(' and c == ')':

return True

return False

//update function to use the same object instead of initializing a new one each time (better space complexity)

def update(self, new_type, new_position):

self.bracket_type = new_type

self.position = new_position

// pass in text to check if text has balanced brackets or not

def isBalanced(text):

brackets_stack = []

current_bracket = Bracket('',0) //initialize an empty bracket

for i, symbol in enumerate(str(text)):

print(brackets_stack)

if symbol in ['(', '[', '{']:

brackets_stack.append(symbol)

current_bracket.update(symbol, i) //call update function

elif symbol in [')', ']', '}']:

return False

elif new_bracket.Match(symbol):

brackets_stack.pop()

else: //since it assumes symmetrical balanced brackets, this can return False immediately

return False

//same as saying return len(list) == 0

return not(len(brackets_stack))

此代码假定text只包含括号。我不知道这是否是一个合理的假设,你应该记住这一点,无论你使用它的任何应用程序。而且,就像MTset在你的帖子上评论的那样,它也假设了简单、对称、平衡的方括号。[{]}将返回False,尽管它在技术上是平衡的。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值