我想实现一个算法,可以在字符串
中找到括号用法中的错误我阅读了几个例子,并想到了为括号创建特殊类,其功能是匹配开括号和右括号
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'
为什么会这样? 关于算法结构你能说什么 - 是不是?
答案 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)
这应该可以解决你的问题,但如果你愿意继续阅读,我会有一些进一步的建议:
有关Python中对象的更多信息,请阅读http://www.tutorialspoint.com/python/python_classes_objects.htm