首页 存档 技术 查看内容

「Python 算法实战」:栈

2018-3-30 13:00 |来自: 互联网 371 0

摘要: 作者:安生 原文:https://blog.ansheng.me/article/python-algorithm-combat-series-stack/ 栈(stack)又称之为堆栈是一个特殊的有序表,其插入和删除操作都在栈顶进行操作,并且按照先进后出,后进先出的规则进行 ...

作者:安生

原文:https://blog.ansheng.me/article/python-algorithm-combat-series-stack/

栈(stack)又称之为堆栈是一个特殊的有序表,其插入和删除操作都在栈顶进行操作,并且按照先进后出,后进先出的规则进行运作。


如下图所示

例如枪的弹匣,第一颗放进弹匣的子弹反而在发射出去的时候是最后一个,而最后放入弹匣的一颗子弹在打出去的时候是第一颗发射出去的。

栈的接口

如果你创建了一个栈,那么那么应该具有以下接口来进行对栈的操作

接口 描述
push() 入栈
pop() 出栈
isEmpty() 判断是否为空栈
length() 获取栈的长度
getTop() 取栈顶的元素,元素不出栈

知道栈需要上述的接口后,那么在Python中,列表就类似是一个栈,提供接口如下:

操作 描述
s = [] 创建一个栈
s.append(x) 往栈内添加一个元素
s.pop() 在栈内删除一个元素
not s 判断是否为空栈
len(s) 获取栈内元素的数量
s[-1] 获取栈顶的元素

Python中的栈接口使用实例:

  1. # 创建一个栈

  2. In [1]: s = []

  3. # 往栈内添加一个元素

  4. In [2]: s.append(1)

  5. In [3]: s

  6. Out[3]: [1]

  7. # 删除栈内的一个元素

  8. In [4]: s.pop()

  9. Out[4]: 1

  10. In [5]: s

  11. Out[5]: []

  12. # 判断栈是否为空

  13. In [6]: not s

  14. Out[6]: True

  15. In [7]: s.append(1)

  16. In [8]: not s

  17. Out[8]: False

  18. # 获取栈内元素的数量

  19. In [9]: len(s)

  20. Out[9]: 1

  21. In [10]: s.append(2)

  22. In [11]: s.append(3)

  23. # 取栈顶的元素

  24. In [12]: s[-1]

  25. Out[12]: 3

一大波实例

在了解栈的基本概念之后,让我们再来看几个实例,以便于理解栈。

括号匹配

题目

假如表达式中允许包含三中括号()[]{},其嵌套顺序是任意的,例如:

正确的格式

  1. {()[()]},[{({})}]

错误的格式

  1. [(]),[()),(()}

编写一个函数,判断一个表达式字符串,括号匹配是否正确

思路

  1. 创建一个空栈,用来存储尚未找到的左括号;

  2. 便利字符串,遇到左括号则压栈,遇到右括号则出栈一个左括号进行匹配;

  3. 在第二步骤过程中,如果空栈情况下遇到右括号,说明缺少左括号,不匹配;

  4. 在第二步骤遍历结束时,栈不为空,说明缺少右括号,不匹配;

解决代码

建议在pycharm中打断点,以便于更好的理解

  1. #!/use/bin/env python

  2. # _*_ coding:utf-8 _*_

  3. LEFT = {'(', '[', '{'} # 左括号

  4. RIGHT = {')', ']', '}'} # 右括号

  5. def match(expr):

  6. """

  7. :param expr: 传过来的字符串

  8. :return: 返回是否是正确的

  9. """

  10. stack = [] # 创建一个栈

  11. for brackets in expr: # 迭代传过来的所有字符串

  12. if brackets in LEFT: # 如果当前字符在左括号内

  13. stack.append(brackets) # 把当前左括号入栈

  14. elif brackets in RIGHT: # 如果是右括号

  15. if not stack or not 1

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部