栈的设计和使用
栈是常用的数据结构。尽管一般的面试里不会让直接写一个栈的实现,不过跟栈有关的编程题很多,今天就遇到一个。
首先看一下栈的定义。栈是一个集合,具有下面的2种基本操作
-
push: 把元素加入集合,这个过程我们叫做压入
-
pop: 把最后加入集合的元素从集合中移除,这个过程我们叫做推出
所以栈在移除元素的时候是遵循LIFO(last in, first out),也就是后进先出的原则的。
直接设计代码:
class stack(object): """docstring for stack""" def __init__(self, data): self.data = [] def push(self,elm): self.data.append(elm) def pop(self): self.data.pop() def len(self): return len(self.data) def is_empty(self): return len(self)== 0
题目:请使用代码实现判断表达式中小括号是否匹配的功能。如果匹配返回True,否则返回False。比如(x * (y +z)) +10中,小括号是匹配的。而(a + b) * )c - d中小括号是不匹配的。
遍历表达式每一个字符
-
如左括号,将左括号压入栈
-
如右括号,则判断栈是否为空,不为空则推出,为空就证明右括号没有匹配的项目,返回False
-
遍历结束之后判断栈是否为空,不为空则返回False,否则返回True
完整代码实现如下
def match_parentthese(erp): data = stack() for ele in erp: if ele == "(": data.push(ele) elif ele == ")": if data.is_empty(): return False break else: data.pop() else: pass if data.is_empty(): return True else: return False