编程题目:写一段代码,判断包含括号 { [ ( ) ] } 的表达式是否合法
先入和元素后判断,后入的元素先判断。这符合栈的特征。
所以这里可以利用栈实现括号合法性的判断。
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))