• Python 栈


    栈抽象数据类型由下面的结构和操作定义。栈是元素的有序集合,添加操作与移除操作都发生在其顶端。栈的操作顺序是 LIFO,它支持以下操作:

    • Stack() 创建一个空栈。它不需要参数,且会返回一个空栈。

    • push(item) 将一个元素添加到栈的顶端。它需要一个参数 item,且无返回值。

    • pop() 将栈顶端的元素移除。它不需要参数,但会返回顶端的元素,并且修改栈的内容。

    • peek() 返回栈顶端的元素,但是并不移除该元素。它不需要参数,也不会修改栈的内容。

    • isEmpty() 检查栈是否为空。它不需要参数,且会返回一个布尔值。

    • size() 返回栈中元素的数目。它不需要参数,且会返回一个整数。

    抽象数据类型的实现常被称为数据结构

    和其他面向对象编程语言一样,每当需要在 Python 中实现像栈这样的抽 象数据类型时,就可以创建新类。栈的操作通过方法实现。更进一步地说,因为栈是元素的集合, 所以完全可以利用 Python 提供的强大、简单的原生集合来实现。这里,我们将使用列表。

    Python 列表是有序集合,它提供了一整套方法。举例来说,对于列表 [2, 5, 3, 6, 7, 4], 只需要考虑将它的哪一边视为栈的顶端。一旦确定了顶端,所有的操作就可以利用 append 和 pop 等列表方法来实现。

    栈的实现,它假设列表的尾部是栈的顶端。当栈增长时(即进行 push 操作),新的元素会被添加到列表的尾部。pop 操作同样会修改这一端。

    
    # 用 Python实现栈 
    
    class Stack:
    
        def __init__(self):
            self.items = []
    
        def isEmpty(self):
            return self.items == []
    
        def push(self, item):
            self.items.append(item)
    
        def pop(self):
            if not self.items:
                return None
            else:
                return self.items.pop()
    
        def peek(self):
            if not self.items:
                return None
            else:
                return self.items[-1]
    
        def size(self):
            return len(self.items)
    
    

    值得注意的是,也可以选择将列表的头部作为栈的顶端。
    不过在这种情况下,便无法直接使用 pop 方法和 append 方法,而必须要用 pop 方法和 insert 方法显式地访问下标为 0 的元素, 即列表中的第 1 个元素。

    
    # 栈的另一种实现方式,选择将列表的头部作为栈的顶端
    
    class Stack2:
        
        def __init__(self):
            self.items = []
        
        def isEmpty(self):
            return self.items == []
        
        def push(self, item):
            self.items.insert(0, item)
        
        def pop(self):
            return self.items.pop(0)
        
        def peek(self):
            return self.items[0]
        
        def size(self):
            return len(self.items)
    
    

    改变抽象数据类型的实现却保留其逻辑特征,这种能力体现了抽象思想。

    尽管上述两 种实现都可行,但是二者在性能方面肯定有差异:

    • append() 方法和 pop() 方法的时间复杂度都是 O(1)

      • 这意味着不论栈中有多少个元素,第一种实现中的 push 操作和 pop 操作都会在恒定的时间内完成
    • 第二种实现的性能则受制于栈中的元素个数

      • 因为 insert(0) 和 pop(0) 的时间复杂度都是 O(n),元素越多就越慢
  • 相关阅读:
    元类,单例模式
    面向对象高阶
    类的三大特性---封装以及Property特性
    c# 中的string(神奇的string)
    c#中的equal和getHashCode
    linq中的Distinct的使用(附带IComparable和IComparer的复习和使用)
    flex布局完整示例
    flex布局中flex-basis的理解
    CSS两端对齐的效果;
    理解c#中扩展性代码
  • 原文地址:https://www.cnblogs.com/dc2019/p/13876025.html
Copyright © 2020-2023  润新知