目录
1 栈概览
- 栈是线性集合,遵从后进先出原则( Last - in first - out , LIFO )原则
- 栈常用的操作包括压入( push ) 和弹出( pop )
- 栈的应用
- 将中缀表达式转换为后缀表达式,并且计算后缀表达式的值
- 回溯算法
- 管理计算机内存以支持函数和方法调用
- 支持应用程序中的撤消功能
- 维护Web浏览器访问链接的历史记录
2 使用栈
2.1 栈接口
- 栈不是Python的内建类型,可以用列表代替,但是列表可以在任何位置插入,删除,替换元素,这些违背了栈作为一种抽象数据类型的本意,因此需要为栈定义一种更为严格的接口
栈方法 |
作用 |
s.isEmpty() | 如果为空返回True,否则返回False |
__len__(s) | 和len(s)相同,返回s中的项的数目 |
__str__(s) | 和str(s)相同,返回s的字符串表示 |
s.__iter__() | 和iter(s)或for item in s:相同;从底部像顶部,访问s中的每一项 |
s.__contains__(item) | 和item in s相同,如果item在s中,返回True,否则返回False |
s1.__add__(s2) | 和s1+s2相同,返回一个新的栈,其中包含了s1和s2中的项 |
s.__eq__(anyObject) | 和s==anyObject相同,如果s等于anyObject,返回True,否则返回False。如果在对应位置的项都是相同的,这两个栈就是相等的 |
s.clear() | 将s清空 |
s.peek() | 返回s顶部的项。先验条件:s不能为空,如果栈为空的话,将会抛出一个KeyError |
s.push(item) | 在s的顶部添加一项 |
s.pop() | 在s的顶部删除一项并返回该项。先验条件:s不能为空。如果栈为空的话,将会抛出一个KeyError |
- pop和peek方法有一个重要的先验条件,如果不满足这个先验条件的话,将会导致一个异常。
- 这个接口的优点是,用户将知道使用哪一个方法,以及这些方法接收什么参数,而不必管选择了哪一种栈实现
操作 | 该操作之后栈的状态 | 返回值 |