数据结构及算法(Python)---栈

来源:互联网 发布:网络最新骗术扒人 编辑:程序博客网 时间:2024/05/20 04:26
   1、数据存储方式:可以采用列表或单链表   2、操作:      Stack() 创建一个新的空栈      push(data) 添加一个新的元素data到栈顶      pop() 弹出栈顶元素      peek() 返回栈顶元素      is_empty() 判断栈是否为空      size() 返回栈的元素个数
"""   采用列表存储的方式"""class Stack(object):    """栈"""    def __init__(self):        """初始化"""        self.__list = []      # 定义一个列表用于存放数据    def push(self, data):        """添加一个新的元素data到栈顶"""        self.__list.append(data)    # 把列表的尾部作为栈顶    def pop(self):        """弹出栈顶元素"""        return self.__list.pop()    # 从列表尾部出栈操作    """        也可以把列表头部作为栈顶,如果把列表头部作为栈顶,        则压栈就是 self.__list.insert(0, data),        出栈则是self.__list.pop(0)        此种方式与把列表尾部作为栈顶区别在于,列表尾部操作时间复杂度是O(1),而头部操作时间复杂度是O(n)    """    def peek(self):        """返回栈顶元素"""        if self.__list:           # 列表为空时,返回None,否则返回最后一个元素            return self.__list[-1]        else:            return None    def is_empty(self):        """判断栈是否为空"""        return not self.__list    # 列表为空时,返回True,否则返回False    def size(self):        """返回栈的元素个数"""        return len(self.__list)if __name__ == '__main__':    s = Stack()    s.push(1)    s.push(2)    s.push(3)    s.push(4)    print("栈顶数据:", s.peek())    print("判空:", s.is_empty())    print("长度:", s.size())    print(s.pop())    print(s.pop())    print(s.pop())    print(s.pop())    print("栈顶数据:", s.peek())    print("判空:", s.is_empty())    print("长度:", s.size())

执行结果

栈顶数据: 4判空: False长度: 44321栈顶数据: None判空: True长度: 0
"""   采用单链表存储的方式"""import SingleLinkListclass Stack(object):    """栈"""    def __init__(self):        """初始化"""        self.__sll = SingleLinkList()   # 定义一个链表用于存放数据    def push(self, data):        """添加一个新的元素data到栈顶"""        self.__sll.add(data)            # 把链表的头部作为栈顶    def pop(self):        """弹出栈顶元素"""        data = self.peek()             # 获取栈顶的元素        if data:            self.__sll.remove(data)    # 删除栈顶的元素        return data                    # 把链表的头部作为栈顶    def peek(self):        """返回栈顶元素"""        return self.__sll.index(0)    # 直接返回首节点的元素        # return self.__sll._SingleLinkList__head.data    # 可以通过实例访问类的私有变量    def is_empty(self):        """判断栈是否为空"""        return self.__sll.is_empty()   # 直接返回链表判空结果 True空    def size(self):        """返回栈的元素个数"""        return self.__sll.length()   # 直接返回链表的长度if __name__ == '__main__':    s = Stack()    s.push(1)    s.push(2)    s.push(3)    s.push(4)    print("栈顶数据:", s.peek())    print("判空:", s.is_empty())    print("长度:", s.size())    print(s.pop())    print(s.pop())    print(s.pop())    print(s.pop())    print("栈顶数据:", s.peek())    print("判空:", s.is_empty())    print("长度:", s.size())

执行结果

栈顶数据: 4判空: False长度: 44321栈顶数据: None判空: True长度: 0