原理:
- 右括号总是与最近的左括号匹配 --- 栈的后进先出
- 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对
- 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号
- 当最终右括号匹配完毕后栈内还有剩余元素,则表明这些位置的左括号没有与之匹配的右括号
代码实现:
1 # 1、创建一个Stack的类 2 # 对栈进行初始化参数设计 3 class Stack(object): 4 def __init__(self,limit=10): 5 self.stack = [] # 存放元素 6 self.limit = limit # 栈容量极限 7 8 # 进栈 9 def push(self,data): 10 # 判断栈是否溢出 11 if len(self.stack) >= self.limit: 12 raise IndexError('超出栈容量极限') 13 self.stack.append(data) 14 15 # 退栈 16 def pop(self): 17 if self.stack: 18 return self.stack.pop() 19 else: 20 # 空栈不能被弹出元素 21 raise IndexError('pop from an empty stack') 22 23 def peek(self): 24 # 查看栈的栈顶元素(最上面的元素) 25 if self.stack: 26 return self.stack[-1] 27 28 # 判断栈是否为空 29 def is_empty(self): 30 return not bool(self.stack) 31 32 def size(self): 33 # 返回栈的大小 34 return len(self.stack) 35 36 # 括号匹配 parenthesis 圆括号 parentheses:parenthesis的复数 37 def balanced_parentheses(parentheses): 38 stack = Stack(len(parentheses)) 39 for parenthesis in parentheses: 40 # 如果是左括号,则入栈 41 if parenthesis == '(': 42 stack.push(parenthesis) 43 elif parenthesis == ')': 44 # 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 45 if stack.is_empty(): 46 return False 47 stack.pop() 48 # 栈为空,返回 True 49 # 栈不为空,返回 False 50 return stack.is_empty() 51 52 if __name__ == '__main__': 53 examples = ['((()))','((())','(()))'] 54 for example in examples: 55 print(example + ':' + str(balanced_parentheses(example)))