3.5.Python实现栈

现在我们已经将栈清楚地定义了抽象数据类型,我们将把注意力转向使用 Python 实现栈。回想一下,当我们给抽象数据类型一个物理实现时,我们将实现称为数据结构。

正如我们在第1章中所描述的,在 Python 中,与任何面向对象编程语言一样,抽象数据类型(如栈)的选择的实现是创建一个新类。栈操作实现为类的方法。此外,为了实现作为元素集合的栈,使用由 Python 提供的原语集合的能力是有意义的。 我们将使用列表作为底层实现。

回想一下,Python 中的列表类提供了有序集合机制和一组方法。例如,如果我们有列表 [2,5,3,6,7,4],我们只需要确定列表的哪一端将被认为是栈的顶部。一旦确定,可以使用诸如 append 和 pop 的列表方法来实现操作。

以下栈实现(ActiveCode 1)假定列表的结尾将保存栈的顶部元素。随着栈增长(push 操作),新项将被添加到列表的末尾。 pop 也操作列表末尾的元素。

  1. class Stack:
  2. def __init__(self):
  3. self.items = []
  4. def isEmpty(self):
  5. return self.items == []
  6. def push(self, item):
  7. self.items.append(item)
  8. def pop(self):
  9. return self.items.pop()
  10. def peek(self):
  11. return self.items[len(self.items)-1]
  12. def size(self):
  13. return len(self.items)

ActiveCode 1

记住我们只定义类的实现,我们需要创建一个栈,然后使用它。ActiveCode 2 展示了我们通过实例化 Stack 类执行 Table 1中的操作。注意,Stack 类的定义是从 pythonds 模块导入的。

Notepythonds 模块包含本书中讨论的所有数据结构的实现。它根据以下部分构造:基本数据类型,树和图。 该模块可以从 pythonworks.org下载。

  1. from pythonds.basic.stack import Stack
  2. s=Stack()
  3. print(s.isEmpty())
  4. s.push(4)
  5. s.push('dog')
  6. print(s.peek())
  7. s.push(True)
  8. print(s.size())
  9. print(s.isEmpty())
  10. s.push(8.4)
  11. print(s.pop())
  12. print(s.pop())
  13. print(s.size())

ActiveCode 2