• python数据结构之堆栈


    本篇我以堆栈的数据类型和操作方法两个方面总结学习笔记

    堆栈(Stack)

    • 一种后进先出(LIFO)的线性数据结构,对堆栈的插入和删除操作都只能在栈顶(top)进行。
    • 堆栈可以通过数组和链表轻松实现

    一、数据类型

    • Stack() 创建堆栈
    • push(item) 向栈顶插入项(平时的insert) / append()(内置)
    • pop() 返回栈顶的项(内置),并从堆栈中删除该项(平时的remove)
    • clear() 清空堆栈
    • empty() 判断堆栈是否为空
    • size() 返回堆栈中项的个数
    • top() 返回栈顶的项

    操作示意图

    二、代码实现

    下面以数组和链表两个方面写出实现代码。时间复杂度分析如下

    • 动态数组插入前面O(n),插入后面0(1)
    • 链表插入前面O(1),插入后面O(n)
    • 所以堆栈为了达到0(1)的效果:数组堆到后面,链表插到前面
    '''
    动态数组堆栈(Array Stack)
    堆栈的数组实现插到数组后面,因此基本都是对最后一个元素进行操作
    '''
    class ArrayStack(object):
        def __init__ (self):
            self._data = [] #空的容器
            
        def __len__ (self): #size
            return len(self._data)
        
        def is_empty(self):
            return len(self._data) == 0
        
        #push进堆栈: O(1)
        def push(self, e):
            self._data.append(e)
            
        # 查看栈顶元素:O(1)
        def top(self):           
            if self.is_empty( ):
                raise ValueError( 'Stack is empty' )
            return self._data[-1]
        
        # 弹出栈顶元素O(1)
        def pop(self):
            if self.is_empty( ):
                raise ValueError( 'Stack is empty' )
            return self._data.pop( )  
        
        #打印堆栈    
        def printstack(self):   
            for i in range(len(self._data)):
                print(self._data[i], end = ' ')
            print()
            
    mystack = ArrayStack()
    print ('size was: ', str(len(mystack)))
    mystack.push(1)
    mystack.push(2)
    mystack.push(3)
    mystack.push(4)
    mystack.push(5)
    print ('size was: ', str(len(mystack)))
    mystack.printstack()
    mystack.pop()
    mystack.pop()
    print ('size was: ', str(len(mystack)))
    mystack.printstack()
    print(mystack.top())
    mystack.pop()
    mystack.pop()
    mystack.pop()
    
    #输出结果
    size was:  0
    size was:  5
    1 2 3 4 5 
    size was:  3
    1 2 3 
    3
    '''
    链表(Linked List)
    堆栈的链表实现插到元素前面,因此都是对第一个节点进行操作
    下面模块导入自我的链表学习笔记代码
    '''
    from LinkedList import LinkedList
    from LinkedList import Node
    
    class LinkedStack(object):
        def __init__ (self):
            self._list = LinkedList()
            
        def __len__ (self):
            return self._list.length
        
        def is_empty(self):
            return self._list.length == 0
        
        # O(1)
        def push(self, e):
            self._list.add_first(e);
            
        # O(1)
        def top(self):
            return self._list.get_first().value;
        
        # O(1)
        def pop(self):
            return self._list.remove_first().value;
            
        def printstack(self):
            self._list.printlist()
            
    mystack = LinkedStack()
    print ('size was: ', str(len(mystack)))
    mystack.push(1)
    mystack.push(2)
    mystack.push(3)
    mystack.push(4)
    mystack.push(5)
    print ('size was: ', str(len(mystack)))
    mystack.printstack()
    mystack.pop()
    mystack.pop()
    print ('size was: ', str(len(mystack)))
    mystack.printstack()
    print(mystack.top())
    mystack.pop()
    mystack.pop()
    mystack.pop()
    
    #输出结果
    size was:  0
    size was:  5
    5 4 3 2 1 
    size was:  3
    3 2 1 
    3
  • 相关阅读:
    Mac下使用SSH连接远程Linux服务器
    Kafka 中文文档
    计算器如何使用取模功能,调出程序员功能,35171799%15的结果是9
    pm2好用的node进程管理工具,监控进程开机自启动,java进程配置,安装Nodejs环境
    vuejs Mac环境下npm run serve 提示 node_modules/.bin/vue-cli-service: Permission denied问题解决方案
    0day相关信息安全技术
    零基础如何学习Web安全?
    余弦的渗透利器
    知道创宇研发技能表v3.1
    Redis主从复制、哨兵、Cluster三种模式
  • 原文地址:https://www.cnblogs.com/kumata/p/9151396.html
Copyright © 2020-2023  润新知