使用Python的平衡括号

时间:2016-05-09 22:49:35

标签: python arrays stack

我想实现一个算法,可以在字符串

中找到括号用法中的错误

我阅读了几个例子,并想到了为括号创建特殊类,其功能是匹配开括号和右括号

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

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

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'

为什么会这样? 关于算法结构你能说什么 - 是不是?

2 个答案:

答案 0 :(得分:2)

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

bracket = Bracket()
#     note these ^^

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

bracket.Match(symbol)

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

答案 1 :(得分: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