原理:
- 右括號總是與最近的左括號匹配 --- 棧的后進先出
- 從左往右遍歷字符串,遇到左括號就入棧,遇到右括號時,就出棧一個元素與其配對
- 當棧為空時,遇到右括號,則此右括號無與之匹配的左括號
- 當最終右括號匹配完畢后棧內還有剩余元素,則表明這些位置的左括號沒有與之匹配的右括號
代碼實現:
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)))