先入和元素后判断,后入的元素先判断。这符合栈的特征。
所以这里可以利用栈实现括号合法性的判断。
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 False14 #或者出栈的数据和后括号对应的前括号不一样15 #则表达式也有问题16 elif s.pop() != d[i]:17 return False18 #遍历玩表达式后,要再次判断一下栈是否为空19 #如果不为空,说明表达式有问题。20 if not s.is_empty():21 return False22 else:23 return True24 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 ValueError39 return self._elems.pop()40 41 def peek(self):42 if self.is_empty():43 raise ValueError44 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))