【问题标题】:Balanced brackets using Python使用 Python 平衡括号
【发布时间】:2016-09-04 17:32:18
【问题描述】:

我想实现一个算法,可以发现字符串中括号使用的错误

我阅读了几个例子,并产生了为括号创建特殊类的想法,该类具有匹配左括号和右括号的功能

class Bracket:
    def __init__(self, bracket_type, position):
        self.bracket_type = bracket_type
        self.position = position

    def Match(self, c):
        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

接下来,我正在使用堆栈,无论 sting 是否平衡。我创建了一个循环,遍历每个符号,如果符号是一个括号,我想将它分配给我的特殊类,以便匹配以进一步关闭。

if __name__ == "__main__":
    text = sys.stdin.read()

    opening_brackets_stack = []
    Balanced = True
    bracket = Bracket


    for i, symbol in enumerate(text):
        if symbol in ['(', '[', '{']:
            bracket.bracket_type = symbol
            opening_brackets_stack.append(symbol)

        elif bracket.Match(bracket.bracket_type, symbol) == True:
            opening_brackets_stack.pop(symbol)

        elif len(opening_brackets_stack) == 0:
            True

但是,不幸的是,这不起作用。

AttributeError: 'str' object has no attribute 'bracket_type'

为什么会这样? 关于算法的结构你能说什么 - 对吗?

【问题讨论】:

    标签: python arrays stack


    【解决方案1】:

    您似乎想在开始符号进入时构造一堆 Bracket 对象,并尝试将堆栈顶部与出现的结束符号匹配。这种方法是合理的。

    但是,您对如何在 python 中声明对象有些困惑。像这样实例化一个新对象:

    myObject = MyClass(constructor_arg_1, constructor_arg_2)
    

    具体来说,您的 Bracket 类具有以下构造函数:

    new_bracket = Bracket(bracket_type, position)
    

    使用该语法创建一个新括号,然后将其压入堆栈:

    bracket_stack.append(new_bracket)
    

    这应该可以解决您的问题,但如果您愿意继续阅读,我还有一些进一步的建议:

    • 看起来 Bracket 对象没有理由知道自己的位置;考虑从构造函数中删除它。
    • 典型的 Python 约定是用大写字母命名您的类,用小写字母命名它们的方法。考虑将 Bracket.Match 重命名为 Bracket.match(或者更好的是 .isMatch,它可以让读者清楚地知道它执行检查并返回一个布尔值)。

    有关 Python 中的对象的更多信息,您可以阅读http://www.tutorialspoint.com/python/python_classes_objects.htm

    【讨论】:

      【解决方案2】:

      如果您希望 bracket 成为类 Bracket 的实例,则需要实例化它:

      bracket = Bracket()
      #     note these ^^
      

      您还将在bracket.Match() 上收到关于传递太多参数的错误。您应该像这样调用该方法:

      bracket.Match(symbol)
      

      因为Bracket() (bracket) 的实例被隐式传递为self

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 2011-12-15
        相关资源
        最近更新 更多