使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/202560.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目中常用的 19 条 SQL 优化宝典

一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引…

解决Vscode使用git提交卡住的问题

使用Vscode的git提交代码经常会很慢/卡住。 先点击左下角,进入设置 找到git的配置(建议直接搜索),把use Editor As commit input的勾选去掉即可解决。

Sentinel 监控数据持久化(mysql)

Sentinel 实时监控仅存储 5 分钟以内的数据,如果需要持久化,需要通过调用实时监控接口来定制,即自行扩展实现 MetricsRepository 接口(修改 控制台源码)。 本文通过使用Mysql持久化监控数据。 1.构建存储表&#xff08…

【Windows 常用工具系列 12 -- win11怎么设置不睡眠熄屏 |win11设置永不睡眠的方法】

文章目录 win11 怎么设置不睡眠熄屏 使用笔记本电脑的时候,如果离开电脑时间稍微长一点就会发现息屏了,下面介绍 设置 Win11 永不睡眠息屏的方法,有需要的朋友们快来看看以下详细的教程。 win11 怎么设置不睡眠熄屏 在电脑桌面上&#xff0c…

C++11『lambda表达式 ‖ 线程库 ‖ 包装器』

✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2022 版本 17.6.5 文章目录 🌇前言🏙️正文1.lambda表达式1.1.仿函数的使用1.2.lambda表达式的语法1.3.lambda表达式的使用…

快速在WIN11中本地部署chatGLM3

具体请看智谱仓库github:GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型 或者Huggingface:https://huggingface.co/THUDM/chatglm3-6b 1. 利用Anaconda建立一个虚拟环境: conda create -n chatglm3 pyt…

Redis打包事务,分批提交

一、需求背景 接手一个老项目,在项目启动的时候,需要将xxx省整个省的所有区域数据数据、以及系统字典配置逐条保存在Redis缓存里面,这样查询的时候会更快; 区域数据字典数据一共大概20000多条,,前同事直接使用 list.forEach…

分布式链路追踪入门篇-基础原理与快速应用

为什么需要链路追踪? 我们程序员在日常工作中,最常做事情之一就是修bug了。如果程序只是运行在单机上,我们最常用的方式就是在程序上打日志,然后程序运行的过程中将日志输出到文件上,然后我们根据日志去推断程序是哪一…

TCL脚本语言光速入门教程,一篇就够了(超全查表)

目录 引子:初见TCL 基本命令 置换命令 普通置换 变量置换 命令置换 反斜杠置换 其他置换 脚步命令 eval命令 source命令 语言命令 简单变量 数组变量 重构变量及其操作 补充概念 全局变量和局部变量 小结 最近突然遇到了要用TCL脚本语言操作的需求…

C/C++小写字母的判断 2022年3月电子学会中小学生软件编程(C/C++)等级考试一级真题答案解析

目录 C/C小写字母的判断 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C小写字母的判断 2022年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个字符,判断是否是英文小…

Qt/QML编程学习之心得:一个Qt工程的学习笔记(九)

1、.pro文件 加CONFIG += c++11,才可以使用Lamda表达式(一般用于connect的内嵌槽函数) 2、QWidget 这是Qt新增加的一个类,基类,窗口类,QMainWindow和QDialog都继承与它。 3、Main函数 QApplication a应用程序对象,有且仅有一个 a.exec() 进行消息循环、阻塞 MyWi…

设计模式-解析器-笔记

“领域规则”模式 在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将稳日抽象为语法规则,从而给出在该领域下的一般性解决方案。 典型模式:Interpreter 动机(Motivation) 在…

【Axure教程】用中继器制作卡片多条件搜索效果

卡片设计通过提供清晰的信息结构、可视化吸引力、易扩展性和强大的交互性,为用户界面设计带来了许多优势,使得用户能够更轻松地浏览、理解和互动。 那今天就教大家如何用中继器制作卡片的模板,以及完成多条件搜索的效果,我们会以…

云原生入门系列(背景和驱动力)

做任何一件事,或者学习、应用一个领域的技术,莫过于先要想好阶段的目标和理解、学习它的意义是什么?解决了什么问题? 这部分,就尝试来探讨下这个阶段需要理解并达成的目标以及践行云原生的意义在哪里。 1.历程 任何阶…

【开源】基于Vue.js的衣物搭配系统的设计和实现

项目编号: S 016 ,文末获取源码。 \color{red}{项目编号:S016,文末获取源码。} 项目编号:S016,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…

解锁潜力:创建支持Actions接口调用的高级GPTs

如何创建带有Actions接口调用的GPTs 在本篇博客中,我们将介绍如何创建一个带有Actions接口调用的GPTs ,以及如何进行配置和使用。我们将以 https://chat.openai.com/g/g-GMrQhe7ka-gptssearch 为例,演示整个过程。 Ps: 数据来源&#xff1a…

全网最全c++中的system详解

这篇文章是二发,做了些微调,感兴趣的朋友可以看原文:C中的system_一只32汪的博客-CSDN博客 1,简介 system()函数是在C制作中十分常用,有用的一个函数。 其效果类似于系统中"cmd"控制台和"bat"文件…

【nlp】2.8 注意力机制拓展

注意力机制拓展 1 注意力机制原理1.1 注意力机制示意图1.2 Attention计算过程1.3 Attention计算逻辑1.4 有无attention模型对比1.4.1 无attention机制的模型1.4.2 有attention机制的模型1 注意力机制原理 1.1 注意力机制示意图 Attention机制的工作原理并不复杂,我们可以用下…

使用持久卷部署 WordPress 和 MySQL

🗓️实验环境 OS名称Microsoft Windows 11 家庭中文版系统类型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 🖇️创建 kustomization.yaml 你可以通过 kustomization.yaml 中的生成器创建一个 Secret存储密码或密…

DBeaver安装与使用教程(超详细安装与使用教程),好用免费的数据库管理工具

🏆好的学习、工作从选对一个对于自己好用的软件开始。 点击目录跳转至相应目录的内容,更方便观看 🏆目录 🏆一、DBeaver介绍1.它支持任何具有一个JDBC驱动程序数据库,也可以处理任何的外部数据源。2.跨平台使用、支持…