python实现常用数据结构

2023-11-18

本文基于Python实现以下几种常用的数据结构,

  • 队列
  • 优先队列
  • 二叉树
  • 单链表
  • 双向链表

—基于List实现

class Stack:
    '栈'
    def __init__(self):
        self.__arr=[]
        self.__size = 0
    
    def push(self, obj):
        '入栈'
        self.__arr.append(obj)
        self.__size += 1

    def pop(self):
        '出栈'
        if self.__size > 0:
            val = self.__arr[self.__size - 1]
            del self.__arr[self.__size - 1]
            self.__size -= 1
            return val
        return None

    def Count(self):
        '栈大小'
        return self.__size

队列

class QueueNode:
    def __init__(self, v):
        self.__data = v
        self.__next = None
    
    def GetVal(self):
        return self.__data

    def AddNextNode(self, v):
        self.__next = QueueNode(v)

    def GetNextNode(self):
        return self.__next
    
    def __del__(self):
      class_name = self.__class__.__name__

class Queue:
    '队列'
    def __init__(self):
        self.__front = None
        self.__rear = None
        self.__size = 0

    def enqueue(self, v):
        '入队'
        if self.__size == 0:
            qnode = QueueNode(v)
            self.__front = qnode
            self.__rear = qnode
        else:
            self.__rear.AddNextNode(v)
            self.__rear = self.__rear.GetNextNode()
        self.__size += 1

    def dequeue(self):
        '出队'
        if self.__size != 0:
            val = self.__front.GetVal()
            self.__front = self.__front.GetNextNode()
            self.__size -= 1
            return val
        return None

    def Count(self):
        '队列大小'
        return self.__size

    def __del__(self):
      class_name = self.__class__.__name__

优先队列

class PriorityQueueNode:
    def __init__(self, v, priority):
        self.__data = v
        self.__priority = priority
        self.__next = None
    
    def GetVal(self):
        return self.__data

    def GetPriority(self):
        return self.__priority

    def AddNextNode(self, v, priority):
        self.__next = PriorityQueueNode(v, priority)

    def GetNextNode(self):
        return self.__next
    
    def SetNextNode(self, node):
        self.__next = node

    def __del__(self):
      class_name = self.__class__.__name__
      #print class_name, "Dispose"

class PriorityQueue:
    '队列'
    def __init__(self):
        node = PriorityQueueNode(None, None)
        self.__front = node
        self.__rear = node
        self.__size = 0

    def push(self, v, priority):
        '入队'
        nd = self.__front.GetNextNode()
        prend = self.__front
        while None != nd and nd.GetPriority() >= priority:
            prend = nd
            nd = nd.GetNextNode()

        qnode = PriorityQueueNode(v, priority)
        qnode.SetNextNode(nd)
        prend.SetNextNode(qnode)

        if nd == None:
            self.__rear = qnode
        self.__size += 1

    def pop(self):
        '出队'
        if self.__size != 0:
            val = self.__front.GetNextNode().GetVal()
            priority = self.__front.GetNextNode().GetPriority()
            self.__front.SetNextNode(self.__front.GetNextNode().GetNextNode())
            self.__size -= 1
            return val
        return None

    def Count(self):
        '队列大小'
        return self.__size

    def __del__(self):
      class_name = self.__class__.__name__

二叉树

class TreeNode:
    def __init__(self, v):
        self.__data = v
        self.__left = None
        self.__right = None

    def SetVal(self,v):
        self.__data = v
    
    def GetVal(self):
        return self.__data

    def GetLeftNode(self):
        return self.__left

    def GetRightNode(self):
        return self.__right
    
    def AddLeftNode(self, v):
        nd = TreeNode(v)
        self.__left = nd

    def AddRightNode(self, v):
        nd = TreeNode(v)
        self.__right = nd

    def __del__(self):
      class_name = self.__class__.__name__

class BinaryTree:
    def __init__(self):
        self.__root = TreeNode(None)
        self.__size = 0
        self.__InOrderList = []
        self.__PreOrderList = []
        self.__PostOrderList = []

    def AddChildNode(self, v):
        if self.__size == 0:
            self.__root.SetVal(v)
        else:
            nd = self.__root
            endnode = None
            while None != nd:
                if v > nd.GetVal():
                    endnode = nd
                    nd = nd.GetRightNode()
                else:
                    endnode = nd
                    nd = nd.GetLeftNode()
            if v > endnode.GetVal():
                endnode.AddRightNode(v)
            else:
                endnode.AddLeftNode(v)
        self.__size += 1
    
    def Count(self):
        return self.__size

    def __preOrder(self, nd):
        if None != nd:
            self.__PreOrderList.append(nd.GetVal())
            self.__preOrder(nd.GetLeftNode())
            self.__preOrder(nd.GetRightNode())

    def PreOrder(self):
        '树的先序遍历'
        self.__PreOrderList = []
        self.__preOrder(self.__root)
        return self.__PreOrderList
    
    def __inOrder(self, nd):
        if None != nd:
            self.__inOrder(nd.GetLeftNode())
            self.__InOrderList.append(nd.GetVal())
            self.__inOrder(nd.GetRightNode())

    def InOrder(self):
        '树的中序遍历'
        self.__InOrderList = []
        self.__inOrder(self.__root)
        return self.__InOrderList
    
    def __postOrder(self, nd):
        if None != nd:
            self.__postOrder(nd.GetLeftNode())
            self.__postOrder(nd.GetRightNode())
            self.__PostOrderList.append(nd.GetVal())

    def PostOrder(self):
        '树的后序遍历'
        self.__PostOrderList = []
        self.__postOrder(self.__root)
        return self.__PostOrderList

    def __del__(self):
      class_name = self.__class__.__name__

单链表

class LinkListNode:
    def __init__(self, v):
        self.__data = v
        self.__next = None
    
    def GetVal(self):
        return self.__data

    def AddNextNode(self, v):
        self.__next = LinkListNode(v)

    def SetNextNode(self, node):
        self.__next = node

    def GetNextNode(self):
        return self.__next
    
    def __del__(self):
      class_name = self.__class__.__name__


class LinkList:
    def __init__(self):
        nd = LinkListNode(None)
        self.__head = nd
        self.__end = nd
        self.__size = 0

    def AddElements(self, datalist):
        for d in datalist:
            nd = LinkListNode(d)
            self.__end.SetNextNode(nd)
            self.__end = nd
            self.__size += 1
        
    def Insert(self, pos, v):
        if pos - 1 > self.__size or pos < 1:
            return
        nd = LinkListNode(v)
        tmp = self.__head
        for idx in range(pos - 1):
            tmp = tmp.GetNextNode()
        nd.SetNextNode(tmp.GetNextNode())
        tmp.SetNextNode(nd)
        if pos == self.__size + 1:
            self.__end = self.__end.GetNextNode()
        self.__size += 1

    def Remove(self, pos):
        if pos > self.__size or pos < 1:
            return
        tmp = self.__head
        for idx in range(pos - 1):
            tmp = tmp.GetNextNode()
        nd = tmp.GetNextNode()
        tmp.SetNextNode(nd.GetNextNode())
        nd.SetNextNode(None)
        if pos == self.__size:
            self.__end = tmp
        self.__size -= 1

    def Reverse(self):
        if self.__size < 2:
            return
        self.__end = self.__head.GetNextNode()
        nd = self.__head.GetNextNode()
        p = nd.GetNextNode()
        while p is not None:
            nd.SetNextNode(p.GetNextNode())
            p.SetNextNode(self.__head.GetNextNode())
            self.__head.SetNextNode(p)
            p = nd.GetNextNode()
    
    def LinkListTolist(self):
        lst = []
        nd = self.__head.GetNextNode()
        while nd is not None:
            lst.append(nd.GetVal())
            nd = nd.GetNextNode()
        return lst

    def Count(self):
        return self.__size

双向链表

class DLinkListNode:
    def __init__(self, v):
        self.__data = v
        self.__next = None
        self.__pre = None
    
    def GetVal(self):
        return self.__data

    def AddNextNode(self, v):
        nd = DLinkListNode(v)
        self.__next = nd
        nd.__pre = self

    def SetNextNode(self, node):
        self.__next = node
        node.__pre = self

    def SetNextNone(self):
        self.__next = None
    
    def SetPreNode(self, node):
        self.__pre = node
        node.__next = self

    def GetNextNode(self):
        return self.__next

    def GetPreNode(self):
        return self.__pre
    
    def __del__(self):
      class_name = self.__class__.__name__

class DLinkList:
    def __init__(self):
        nd = DLinkListNode(None)
        self.__head = nd
        self.__end = nd
        self.__size = 0
    
    def AddElements(self, datalist):
        for x in datalist:
            nd = DLinkListNode(x)
            self.__end.SetNextNode(nd)
            self.__end = self.__end.GetNextNode()
            self.__size += 1

    def Insert(self, pos, v):
        if pos - 1 > self.__size or pos < 1:
            return
        nd = DLinkListNode(v)
        tmp = self.__head
        for idx in range(pos - 1):
            tmp = tmp.GetNextNode()
        if pos - 1 == self.__size:
            nd.SetNextNone()
        else:
            nd.SetNextNode(tmp.GetNextNode())
        tmp.SetNextNode(nd)
        if pos == self.__size + 1:
            self.__end = self.__end.GetNextNode()
        self.__size += 1

    def Remove(self, pos):
        if pos > self.__size or pos < 1:
            return
        tmp = self.__head
        for idx in range(pos - 1):
            tmp = tmp.GetNextNode()
        nd = tmp.GetNextNode()
        if nd == self.__end:
            tmp.SetNextNone()
        else:
            tmp.SetNextNode(nd.GetNextNode())
        if pos == self.__size:
            self.__end = tmp
        self.__size -= 1
    
    def DLinkListTolist(self):
        lst = []
        nd = self.__head.GetNextNode()
        while nd is not None:
            lst.append(nd.GetVal())
            nd = nd.GetNextNode()
        return lst

    def DLinkListToReverselist(self):
        lst = []
        nd = self.__end
        while nd != self.__head:
            lst.append(nd.GetVal())
            nd = nd.GetPreNode()
        return lst
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现常用数据结构 的相关文章

随机推荐

  • linux驱动:一、字符设备的介绍和demo

    一 字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动 字符设备就是一个一个字节 按照字节流进行读写操作的设备 读写数据是分先后顺序的 比如我们最常见的点灯 按键 IIC SPI LCD 等等都是字符设备 这些设备的驱动就
  • 如何清空matlab命令窗口,matlab如何清空命令窗口中的内容

    还有一个常用的clf 清除图形窗口命令www mh456 com防采集 在matlab的命令窗口 输入2113clc命令 即可清空命令窗5261口中的内容 从matlab2012b版本后 还可以4102利用HOME菜单页下的Clear Co
  • MS17-010(永恒之蓝)漏洞复现和分析

    MS17 010 永恒之蓝 漏洞复现和分析 一 漏洞简介 1 永恒之蓝介绍 永恒之蓝是指2017年4月14日晚 黑客团体Shadow Brokers 影子经纪人 公布一大批网络攻击工具 其中包含 永恒之蓝 工具 永恒之蓝 利用Windows
  • PTA天梯赛L1-058 6翻了(c语言实现)

    原题链接 这道题稍微有一点点灵活 乍一想还是有点想不到的 主要还是对6的个数进行计数 如果是6则计数有多少个6 如果不是6的话则要进行判断 如果在此之前6的个数超过了3 gt 3 但是小于等于9那么要输出9 如果在此之前6的个数超过了9 g
  • ctfshow---sql注入(214-253)

    目录 web214 web215 web216 web217 web218 web219 web220 web221 web222 web223 web224 web225 web226 web227 web228 229 230 web2
  • 解决git速度慢的问题

    git clone特别慢是因为github global ssl fastly net域名被限制了 只要找到这个域名对应的ip地址 然后在hosts文件中加上ip gt 域名的映射 刷新DNS缓存便可 github com的ip 打开hos
  • 【Linux实操】vi和vim编辑器的使用(vim三种模式的切换)

    vim三种模式介绍及切换 一 Linux实操vi和vim编辑器的使用 1 正常模式 2 插入模式 编辑模式 3 命令行模式 二 vim的三种模式的相互转换 三 vi vim快捷键一览图 一 Linux实操vi和vim编辑器的使用 所有的 L
  • 获取剪贴板内容

  • MySQL命令alter add:增加表的字段

    alter add命令用来增加表的字段 alter add命令格式 alter table 表名 add字段 类型 其他 例如 在表MyClass中添加了一个字段passtest 类型为int 4 默认值为0 mysql gt alter
  • centos通过rpm包实现内核升级

    一 查看当前内核版本 root lvs uname r 3 10 0 1160 el7 x86 64 二 前往链接 elrepo获取最新的repo包 rpm import https www elrepo org RPM GPG KEY e
  • 高安全等级密码模块安全技术设计

    摘 要 随着金融 大数据等行业的普及和发展 对密码设备的依赖与日俱增 并且业内在数据安全领域提出了多方面更高的要求 例如密码模块的物理安全 抗非入侵式攻击 抗环境失效等 迫切需要更高安全等级的密码模块来支撑行业的实际应用需求 依托安全二级密
  • 【Linux命令—shell】正则表达式

    正则表达式 regular expression 描述一个字符集合的表达方式 模糊匹配 目录 1 基本正则 2 扩展正则 3 兼容的正则 perl 4 综合案例练习 1 基本正则 演示如下 2 扩展正则 注意 grep不支持扩展正则 如果需
  • Python中os.listdir和os.walk的区别

    os listdir和os walk都是获取指定目录下的文件内容 两者有一定的区别 现在举例说明 如下图所示目录结构 os walk import os def file name file site for root dirs files
  • pandas学习笔记(一)---创建dataframe的4种常用方式

    一 使用numpy创建 import pandas as pd import numpy as np df pd DataFrame np arange 16 reshape 4 4 index list abcd columns one
  • 【Python学习笔记】Python中的heapq

    Python中的heapq 1 基本介绍 堆是非线性的树形的数据结构 有两种堆 大根堆与小根堆 大根堆 树中各个父节点的值总是大于或等于任何一个子节点的值 小根堆 树中各个父节点的值总是小于或等于任何一个子节点的值 我们一般使用二叉堆来实现
  • python稳定版本是哪些_python3哪个版本稳定_后端开发

    C语言中关系表达式和逻辑表达式的值是什么 后端开发 关系表达式和逻辑表达式的值是布尔型 分别为真 true 或假 false 即0或1 但c语言没有布尔类型 以0为假 非0即真 python3哪个版本稳定 python3中3 4比较稳定 基
  • android状态栏(沉浸式状态栏,改变状态栏字体颜色,背景颜色)

    通过主题设置状态栏 在API21 android 5 0 之后 设置状态栏透明效果为半透明 并且为了保证在API19 android 4 4 正常使用 所以需要3份不同的style文件 即values v19 android 4 4之后使用
  • ajax请求,进行ajax处理后端特殊字符串

    前端传入officeId的值 将office对应ip地址传入到 function getinipaddress var officeId document getElementById officeId value var isinheri
  • Linux学习第16天:Linux设备树下的LED驱动开发:举一反三 专注专心专业

    Linux版本号4 1 15 芯片I MX6ULL 大叔学Linux 品人间百味 思文短情长 在开题之前 先说一下这次的题目 尤其是后面的 举一反三 专注专心专业 到底想给大家传递什么信息 LED驱动开发 目前为止已经学了好几种方法 包括裸
  • python实现常用数据结构

    本文基于Python实现以下几种常用的数据结构 栈 队列 优先队列 二叉树 单链表 双向链表 栈 基于List实现 class Stack 栈 def init self self arr self size 0 def push self