使用Python实现几种底层技术的数据结构
使用Python实现几种底层技术的数据结构
数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系。
Python实现了许多常见的底层数据结构,以下是其中几种常见的:
列表(List):列表是Python中最常用的数据结构之一,它可以存储任意类型的元素,并且可以动态地改变大小。列表使用方括号 [] 来表示,可以通过索引访问和修改元素。
元组(Tuple):元组与列表类似,但是元组是不可变的,即创建后不能修改。元组使用圆括号 () 来表示,可以通过索引访问元素。
字典(Dictionary):字典是一种键值对的数据结构,可以用来存储和访问具有唯一键的值。字典使用花括号 {} 来表示,键和值之间使用冒号 : 分隔。
集合(Set):集合是一种无序且不重复的数据结构,可以用来进行集合运算,如并集、交集、差集等。集合使用花括号 {} 来表示,元素之间使用逗号分隔。
字符串(String):字符串是一种由字符组成的序列,可以用来表示文本。字符串是不可变的,即创建后不能修改。字符串可以使用单引号或双引号来表示。
在Python中,虽然内置的类型如列表、字典、集合和元组可以用于大多数应用,但有时我们可能需要实现更具体的底层数据结构,例如栈、队列、链表、二叉树等。以下是这些数据结构的简单Python实现:
★栈(Stack)
栈是一种后进先出(LIFO)的数据结构。只允许在栈顶进行插入(push)和删除(pop)操作。在Python中可以使用列表来实现一个简单的栈。

class Stack:def __init__(self):self.items = []def is_empty(self):return not self.itemsdef push(self, item):self.items.append(item)def pop(self):if not self.is_empty():return self.items.pop()raise IndexError("pop from empty stack")def peek(self):if not self.is_empty():return self.items[-1]raise IndexError("peek from empty stack")def size(self):return len(self.items)#使用Stack类创建一个栈对象,并进行操作:
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.size()) # 输出:3
print(stack.pop()) # 输出:3
print(stack.peek()) # 输出:2
print(stack.is_empty()) # 输出:False
★队列(Queue)
队列是一种先进先出(FIFO)的数据结构。只允许在队尾进行插入(enqueue)操作,在队头进行删除(dequeue)操作。在Python中可以使用列表来实现一个简单的队列。

class Queue:def __init__(self):self.items = []def is_empty(self):return not self.itemsdef enqueue(self, item):self.items.insert(0, item)def dequeue(self):if not self.is_empty():return self.items.pop()raise IndexError("dequeue from empty queue")def size(self):return len(self.items)#使用Queue类创建一个队列对象,并进行操作:
queue = Queue()
queue.enqueue('a')
queue.enqueue('b')
queue.enqueue('c')
print(queue.size()) # 输出:3
print(queue.dequeue()) # 输出:'a'
print(queue.is_empty()) # 输出:False
★链表(Linked List)
链表是一种由节点组成的序列,每个节点包含数据和指向下一个节点的引用。单链表(Singly Linked List)是一种常见的链表,由一系列节点组成,每个节点包含两个部分:数据和指向下一个节点的引用。
在Python中,引用可以被看作是自动管理的指针,它们指向对象的内存地址,但这一切都是在Python的内部机制中自动处理的。
在Python中可以使用类来实现一个简单的链表。

下面是一个简单的示例,展示了如何在Python中实现单链表:
class Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef is_empty(self):return self.head is None def append(self, data):if not self.head:self.head = Node(data)else:current = self.headwhile current.next:current = current.nextcurrent.next = Node(data)def display(self):elements = []current = self.headwhile current:elements.append(current.data)current = current.nextreturn elementsdef remove_node(self, data):if not self.is_empty():current_node = self.headif current_node.data == data:self.head = current_node.nextelse:while current_node.next:if current_node.next.data == data:current_node.next = current_node.next.nextbreakcurrent_node = current_node.nextdef get_size(self):size = 0current_node = self.headwhile current_node:size += 1current_node = current_node.nextreturn size#使用LinkedList类创建一个链表对象,并进行操作:
linked_list = LinkedList()
print(linked_list.is_empty()) # 输出:Truelinked_list.append(1)
linked_list.append(2)
linked_list.append(3)print(linked_list.display()) # 输出[1, 2, 3]print(linked_list.get_size()) # 输出:3linked_list.remove_node(2)
print(linked_list.get_size()) # 输出:2
★二叉树(Binary Tree)
二叉树是每个节点最多有两个子节点的树结构。二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树( 即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。

class TreeNode:def __init__(self, data):self.data = dataself.left = Noneself.right = Noneclass BinaryTree:def __init__(self, root):self.root = TreeNode(root)def insert_left(self, current_node, data):if current_node.left is None:current_node.left = TreeNode(data)else:new_node = TreeNode(data)new_node.left = current_node.leftcurrent_node.left = new_nodedef insert_right(self, current_node, data):if current_node.right is None:current_node.right = TreeNode(data)else:new_node = TreeNode(data)new_node.right = current_node.rightcurrent_node.right = new_node# 用于演示的简单遍历方法def preorder_traversal(self, start, traversal=[]):"""Root -> Left -> Right"""if start:traversal.append(start.data)self.preorder_traversal(start.left, traversal)self.preorder_traversal(start.right, traversal)return traversal#使用 BinaryTree类创建一个二叉树对象,并进行操作
# 创建一个二叉树对象
binary_tree = BinaryTree(1)# 插入左子节点
binary_tree.insert_left(binary_tree.root, 2)
# 插入右子节点
binary_tree.insert_right(binary_tree.root, 3)# 插入左子节点的左子节点
binary_tree.insert_left(binary_tree.root.left, 4)
# 插入左子节点的右子节点
binary_tree.insert_right(binary_tree.root.left, 5)# 插入右子节点的左子节点
binary_tree.insert_left(binary_tree.root.right, 6)
# 插入右子节点的右子节点
binary_tree.insert_right(binary_tree.root.right, 7)# 进行先序遍历
print(binary_tree.preorder_traversal(binary_tree.root))
上述这些代码示例,演示了如何使用Python实现栈、队列、链表和二叉树的基础版本,实际应用中可能需要更多的功能和错误处理。这些数据结构在算法和数据处理中都有广泛的应用,掌握它们的实现原理和使用方法对于进一步提升编程能力十分重要。
附录
你应该了解的8种常见数据结构 https://www.toutiao.com/article/6799768009498952203/
算法基础系列 https://blog.csdn.net/cnds123/article/details/120061638
相关文章:
使用Python实现几种底层技术的数据结构
使用Python实现几种底层技术的数据结构 数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这…...
前端面试题【72道】
文章目录 1. 说说你对盒子模型的理解2. css选择器有哪些?优先级?哪些属性可以继承?3. 元素水平垂直居中的方法有哪些?如果元素不定宽高呢?4. 怎么理解回流跟重绘?什么场景下会触发?5. 什么是响应…...
OpenGL 绘制文本(QPainter)
文章目录 一、简介二、实现代码三、实现效果一、简介 OpenGL中并没有绘制文本的相关函数,因此这里仍然用的是Qt中的QPainter工具来绘制文本,但是其相关的定位这里仍然会用OpenGL中的坐标转换。这里对其也进行封装一下,方便后续使用。 二、实现代码 TextDrawable.h #ifndef T…...
windows电脑连接Android和iPhone真机调试
windows电脑连接Android和iPhone真机调试 目前用的是Hbuilder X编辑器,在正常情况下,Android手机需要在 "设置 ----> 更多设置 ----->关于手机 ------> 版本号(手指点击5-7下即可打开开发者模式)"(我的是vivo的…...
windows上 adb devices有设备 wsl上没有
终于解决了!!!! TAT,尝试了很多种办法。 比如WSL中的adb和Windows中的adb版本必须一致,一致也没用,比如使用 ln 建立链接也没用。 这个解决办法的前提是windows中的abd是好用的。 ●在windows…...
释放搜索潜力:基于Docker快速搭建ES语义检索系统(快速版),让信息尽在掌握
搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…...
JS--localStorage设置过期时间的方案(有示例)
原文网址:JS--localStorage设置过期时间的方案(有示例)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何使用localStorage设置数据的过期时间。 问题描述 localStorage是不支持设置过期时间的,cookie虽然支持设置过期时间但它存的数据量很小。所…...
JNPF开发平台凭什么火?
一、关于低代码 JNPF平台在提供无代码(可视化建模)和低代码(高度可扩展的集成工具以支持跨功能团队协同工作)开发工具上是独一无二的。支持简单、快速地构建及不断改进Web端应用程序,可为整个应用程序的生命周期提供全…...
关于“计算机中由于找不到msvcr120.dll,无法继续执行代码5种解决方法
今天,我想和大家分享一下关于“由于找不到msvcr120.dll,无法继续执行代码5种解决方法”的话题。在我们日常的使用中,有时候会遇到这样的问题:在运行某个程序时,突然提示“无法继续执行代码,因为找不到msvcr120.dll”。…...
LR学习笔记——基本面板
文章目录 面板介绍色彩调整区域明暗调整区域纹理及质感色彩饱和 面板介绍 面板如上图所示 基本可分为几个板块:色彩、明暗、纹理及质感、色彩饱和 色彩调整区域 色温:由蓝色和黄色控制色调:由绿色和洋红控制 互补色:蓝色对黄色&…...
Cloud 微服务
架构 一 单体架构 1 概念 将项⽬所有模块(功能)打成jar或者war,然后部署⼀个进程。 互联网早期,一般的网站应用流量较小,只需一个应用,将所有功能代码都部署在一起就可以,这样可以减少开发、…...
若依前后端分离版,快速上手
哈喽~大家好,这篇来看看若依前后端分离版,快速上手(肝了挺久的)。 🥇个人主页:个人主页 🥈 系列专栏:【Springboot和Vue全栈开发】…...
Java-抽象类、抽象方法
【1】抽象类和抽象方法的关系: 抽象类中可以定义0-n个抽象方法。 【2】抽象类作用: 在抽象类中定义抽象方法,目的是为了为子类提供一个通用的模板,子类可以在模板的基础上进行开发,先重写父类的抽象方法,…...
南京--ChatGPT/GPT4 科研实践应用
2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…...
【VRTK】【VR开发】【Unity】7-配置交互能力和向量追踪
【前情提要】 目前为止,我们虽然设定了手模型和动画,还能够正确根据输入触发动作,不过还未能与任何物体互动。要互动,需要给手部设定相应的Interactor能力。 【配置Interactor的抓取功能】 在Hierarchy中选中[VRTK_CAMERA_RIGS_SETUP] ➤ Camera Rigs, Tracked Alias ➤ …...
【JS】Chapter14-深入面向对象
站在巨人的肩膀上 黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程 (十四)深入面向对象 1. 编程思想 1.1 面向过程介绍 面向过程就是分析出解决问题所需要的步骤,…...
RabbitMQ消息队列快速入门
RabbitMQ消息队列快速入门 初始MQ MQ全称为Message Queue,即消息队列,是在消息的传输过程中保存消息的容器。它是典型的生产者-消费者模型。 生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。消息的生产和消费都是异步的&am…...
django DRF认证组件
一、学习DRF的认证类; 设计:LoginView不登录就可以访问,UserView和OrderView需要通过认证后才能访问; 1、urls.py urlpatterns [path(login/, views.LoginView.as_view()),path(user/, views.UserView.as_view()),path(order/,…...
操作系统(三)| 进程管理上 进程状态 同步 互斥
目录 1 进程和程序区别 2 进程状态 2.1 进程的5种基本状态 2.2 进程状态之间转换 2.3 七状态模型 3 进程描述 3.1 进程控制块 PCB 3.2 进程块组织方式 4 进程控制 5 进程同步 互斥 5.1 区分进程互斥和同步 5.2 核心方案 5.3 其他方案 方案1 设置锁变量 方案2 严…...
Postman插件如何安装(一)
我们chrome插件网热门推荐的软件之一就是postman。但是postman的适应平台分为:postman chrome应用程序,postman应用程序,postman插件。谷歌应用商店从2018年3月开始停止chrome应用程序的更新。除非继续使用老版本的postman chrome应用程序&am…...
Obsidian 的附件管理
一、Obsidian 的附件管理绝大多数主流传统笔记软件,在附件插入与管理上,采用的是“绑定式存储”逻辑,这也是很多用户长期以来的使用习惯。简单来说,当我们在传统笔记中插入一张图片、一个文件时,软件会直接将这份素材文…...
3401黄大年茶思屋榜文保姆级全落地解法「34期 1题」全系统可编程安全易用高效统一架构重构与原约束双路径落地解法
华夏之光永存・开源:黄大年茶思屋榜文保姆级全落地解法「34期 1题」 小标题:全系统可编程安全易用高效统一架构重构与原约束双路径落地解法 一、摘要 全系统可编程赛道当下全球现代工程技术已触达绝对性能天花板,现有eBPF、Wasm分立方案、传统内核可编程框架、常规工具链…...
从无人机飞控到机械臂:一个Python函数搞定旋转向量转矩阵的工程实战
从无人机飞控到机械臂:一个Python函数搞定旋转向量转矩阵的工程实战 在机器人控制和三维空间计算中,旋转向量的处理是核心问题之一。无论是无人机飞控系统的姿态解算,还是机械臂末端的运动规划,都需要将旋转向量转换为旋转矩阵。这…...
CPT外汇:多元化产品体系的综合呈现
金融服务行业的复杂性决定了平台需要在多个维度上同时具备较高的水准。CPT外汇经过多年的发展,已经在合规、技术、服务、教育等方面形成了一套相互支撑的体系。本文从评测视角出发,对其综合实力进行多维度的解读,呈现一个具有结构感的平台画像…...
从2E服务写入超长DID说起:一个案例拆解Autosar UDS诊断中‘非主流’的帧交互流程
从2E服务写入超长DID案例解析Autosar UDS诊断中的多帧交互机制 在汽车电子开发领域,诊断协议的设计与实现往往是系统可靠性的关键所在。当我们谈论UDS(Unified Diagnostic Services)诊断时,大多数开发者首先想到的是常规的单帧请求…...
高中化学资源合集(第三辑)
洋葱学院高中化学-人教版 文件大小: -内容特色: 人教版高中化学同步动画精讲,覆盖必修选修适用人群: 高一至高三学生及化学教师核心价值: 5分钟短视频拆解重难点,提分立竿见影下载链接: https://pan.quark.cn/s/87865ac82540 初高中化学火花学院&#…...
FLUX.1-Krea-Extracted-LoRA效果展示:工业零件图中金属拉丝与氧化痕迹
FLUX.1-Krea-Extracted-LoRA效果展示:工业零件图中金属拉丝与氧化痕迹 1. 真实感工业图像生成新标杆 在工业设计和产品展示领域,如何快速生成具有真实质感的零件图像一直是个挑战。传统3D建模需要耗费大量时间,而普通AI生成的图像又常常带有…...
OpenClaw AI代理集成WhoBot技能:打造专业AI电话数字员工助手
1. 项目概述:为你的AI小龙虾装上“AI电话专家”大脑 如果你正在玩转OpenClaw(那个被大家亲切称为“小龙虾”的开源AI代理),并且恰好对AI电话数字员工这个领域感兴趣,那你可能已经发现了一个痛点:当你问小龙…...
智能门锁常用的国产NFC芯片方案解析:从VRC522到433MHz的选型思考
在智能门锁、酒店锁、桑拿柜锁等非接触式读卡装置中,NFC(近场通信)读写芯片几乎是标配。而在国产芯片阵营中,VRC522是一款非常典型的代表。今天我们就以VRC522的规格书为切入点,聊聊这类芯片的核心特性、适用场景&…...
Sonos Roam深度评测:便携音箱如何实现智能音频生态整合
1. 产品定位与市场切入:Sonos Roam的“迟到”与“厚积”当Sonos在2021年春季发布Roam时,整个音频圈的反应是复杂的。一方面,便携蓝牙音箱市场早已是一片红海,从JBL、Bose到无数中国品牌,产品形态和功能似乎已固化&…...
