先入和元素后判斷,后入的元素先判斷。這符合棧的特征。
所以這里可以利用棧實現括號合法性的判斷。
1 #!/usr/bin/env python3 2 3 def judge(expression): 4 s = Stack() 5 d = {'}':'{', ']':'[', ')':'('} 6 for i in expression: 7 if i == '[' or i == '{' or i == '(': 8 s.push(i) 9 if i == ']' or i == '}' or i == ')': 10 #當遍歷到后括號時,發現棧里沒有數據 11 #說明表達式有問題 12 if s.is_empty(): 13 return False 14 #或者出棧的數據和后括號對應的前括號不一樣 15 #則表達式也有問題 16 elif s.pop() != d[i]: 17 return False 18 #遍歷玩表達式后,要再次判斷一下棧是否為空 19 #如果不為空,說明表達式有問題。 20 if not s.is_empty(): 21 return False 22 else: 23 return True 24 25 26 class Stack(object): 27 def __init__(self): 28 self._elems = [] 29 30 def is_empty(self): 31 return self._elems == [] 32 33 def push(self, elem): 34 self._elems.append(elem) 35 36 def pop(self): 37 if self.is_empty(): 38 raise ValueError 39 return self._elems.pop() 40 41 def peek(self): 42 if self.is_empty(): 43 raise ValueError 44 return self._elems[-1] 45 46 if __name__ == "__main__": 47 ep = "[a+b*(5-4)]*{x+b+b*{(1+2)}}" 48 ep1 = "[a+b*(5-4)]*{x+b+b*{{(1+2)}}" 49 print(judge(ep)) 50 print(judge(ep1))