遍历堆栈(反向列表),是不是有 isempty() 方法?

Posted

技术标签:

【中文标题】遍历堆栈(反向列表),是不是有 isempty() 方法?【英文标题】:Iterating over a stack (reverse list), is there an isempty() method?遍历堆栈(反向列表),是否有 isempty() 方法? 【发布时间】:2011-05-31 15:28:09 【问题描述】:

在 Python 中迭代堆栈的最佳方法是什么?

a = [1,2,3,4]
while (len(a) > 0)
  print a.pop()

# prints 4, 3, 2, 1 in sequence

我找不到isempty 方法,并且每次检查长度似乎都有问题。

【问题讨论】:

你到底想做什么?反向打印? 【参考方案1】:

将列表用作布尔条件,仅当列表为空时才计算为False

>>> while a:
...     print a.pop()
... 
4
3
2
1

这不仅更简洁,而且更高效(1.49 毫秒对 1.9 毫秒的 10,000 个列表),因为它只需要检查是否存在第一个元素:

$ python -mtimeit -c 'a=range(10000)
while len(a):
  a.pop()'
10000 loops, best of 3: 1.9 msec per loop
$ python -mtimeit -c 'a=range(10000)
while a:     
  a.pop()'
1000 loops, best of 3: 1.49 msec per loop

您也可以使用reversed() 来获取反向迭代器:

>>> for n in reversed(a):
...     print n
... 
4
3
2
1

或者在一行中:

print '\n'.join(map(str, reversed(a)))

请注意,这不会从列表中删除元素。如有必要,您可以使用del a[:] 来实现。

【讨论】:

【参考方案2】:

Python: What is the best way to check if a list is empty?

Stack (Python)

【讨论】:

【参考方案3】:

容器的通常约定是它们不为空时为 True,为空时为 False,所以你可以这样做:

while a:
    print a.pop()

【讨论】:

以上是关于遍历堆栈(反向列表),是不是有 isempty() 方法?的主要内容,如果未能解决你的问题,请参考以下文章

先序遍历的非递归遍历算法

非递归实现中序,先序,后序遍历二叉树部分代码

非递归实现中序,先序,后序遍历二叉树部分代码

使用两个队列实现堆栈

基于C语言堆栈push,pop,destroystack,isEmpty,isFull实现

如何判断一个值是不是在list中