Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python带你了解数据结构【一】

Python带你了解数据结构【一】

作者头像
我被狗咬了
发布于 2020-06-24 08:28:51
发布于 2020-06-24 08:28:51
51600
举报
文章被收录于专栏:Python乱炖Python乱炖
运行总次数:0

我们学过计算机的童鞋们都知道算法与数据结构一直是大家逃不掉的噩梦,那么今天小编就带大家来看看用python来解读这些数据结构是否会变得简单一点呢?

数据结构,顾名思义就是存放数据的结构,结构的不同会导致我们增删改查数据的效率也大不相同,所以为了能够高效的操作数据,我们需要了解数据结构,并且在适当的情况下使用特定的数据结构。

举个简单的例子,我现在期中考试的成绩出来了,我需要登记大家期中考试的成绩,这个时候我们需要使用什么数据类型?

大家都知道python里面有list和tuple这两种数据类型。现在我们需要一份名单,并且需要在这份名单上做更新和修改处理,那对应的我们需要选择什么数据结构呢?因为需要做修改的操作,所以我们选择list作为我们存储数据的主要方式。当登记完所有的成绩,我们需要把成绩发放到各位同学手中,这个时候为了保证每个人的真实成绩都是不可被修改的,我们又需要改变数据结构,选择tuple类型,来确保每个同学的成绩都是不可被修改的!

上面这个例子就是告诉我们,在不同的时候,我们往往需要选择不同的数据结构来存储对应的数据,以确保我们能够高效的访问或者修改数据,这也就是我们需要学习数据结构的初衷了~

首先,关于数据结构,我们主要分为两类,线性结构和非线性结构,线性结构中的元素都是一一对应的关系,而非线性结构可能存在一对多,多对多的关系。举个例子,一次函数:y=kx(一条直线),x和y的值都是一一对应的,这种关系就是线性结构。

但是像y=kx^2,这种结构就属于非线性结构了,一个y对应两个x的值。

线性结构里面主要有数组(Array),栈(Stack),队列(Queue),链表(Linked List)

非线性结构主要是:树(Tree),图(Graph),堆(Heap),散列表(Hash)

今天我们主要来看看线性结构。

数组(Array)

数组,将具有相同类型的若干变量有序地组织在一起的集合就是数组。在python里面,list就是数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array = [1, 2, 3, 4, 5, 6, 7]

使用中括号包围,将里面的多个元素用逗号隔开,这就是数组了。对于数组我们如何进行它的增删改查操作呢?

数组是一个有序的集合,所以在数组中,每个元素都有一个与之对应的索引,通过这个索引我们就能取到这个值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(array[0])
获取索引为0的元素的值

关于数组的修改操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
修改元素值
array[0] = 5
中间插入新的值
array.insert(0, 5)
尾部插入新的值
array.append(5)
删除值
array.remove(5)

链表(Linked List)

说了数组就不得不说和数组相似的链表,链表的定义是不连续(这个不连续是针对于物理存储而言),没有顺序的数据结构。是由多个节点组成的。

从下图中我们可以看出,链表好像就是一个单向传递的过程,总是由上一个传向下一个(这就是单链表),并且每个节点都是由两部分组成,一部分存放数据,一部分指向下一个节点。这就像接力赛跑一样,每个队员都需要将自己的接力棒传向下一个队员。

(链表和数组的区别)

链表分为单链表,双链表和循环链表,我们这边以简单常见的单链表为例。谈谈,简单链表的python实现

链表是由多个不同的节点构成的,所以我们需要定义一个节点,一个节点主要包含两部分,一部分是指针,指向下一组数据,另一部分是存放数据的信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Node(object):    #初始化,需要传入节点的数据
    def __init__(self, data):
        self.data = data
        self.next = None

作为节点类,要具备一些常用的方法,获取节点数据,获取下个节点,更新节点的数据,更新下个节点,这些都可以定义在node类里面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    #返回节点的数据
    def get_data(self):
        return self.data

    #更新节点的数据
    def set_data(self, new_data):
        self.data = new_data

    #返回后继节点
    def get_next(self):
        return self.next

    #变更后继节点
    def set_next(self, new_next):
        self.next = new_next

定义完节点后,我们就可以来实现简单的链表了。

首先来说一下链表的添加:添加操作,如果是插入操作,需要删除原有的指针,将被删除的指针重新指向新的节点,新的节点指向原来节点指向的那个节点。如果是添加在头部,只需要将新的节点指向头节点即可。

删除操作,需要将被删节点的前一个节点直接指向被删节点的后一个节点即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Reference codes:https://www.jianshu.com/p/e4000619232bclass Linked_list:    # 初始化,头结点为空
    def __init__(self):
        self.head = None

    # 添加节点,添加的新节点作为新的头结点
    def add(self, data):
        new_node = Node(data)
        new_node.set_next() = self.head
        self.head = new_node

    # 包含查询,传入值,返回该值在链表中是否存在
    def search(self, data):
        checking = self.head  # 从头结点开始查询
        while checking != None:
            if checking.get_data() == data:  # 查找到,返回True
                return True
            checking = checking.get_next()  # 查询下一个节点
        return False  # 遍历到最后也未能找到,返回False

    # 删除节点,将第一个具有传入值的节点从链表中删除
    def remove(self, data):
        checking = self.head  # 从头结点开始查询
        previous = None  # 记录前一个节点,头结点的前一个节点为None

        while checking != None:
            if checking.get_data() == data:  # 查找到,跳出查找循环
                break
            previous = checking  # 更新前一个节点
            checking = checking.get_next()  # 查询下一个节点

        if previous == None:  # 如果头结点便是查找的节点
            self.head = checking.get_next()
        else:  # 查找的节点不在头节点,即,存在前驱节点
            previous.set_next(checking.get_next())


    # 判断链表是否为空
    def isEmpty(self):
        return self.head == None


    # 返回链表长度
    def size(self):
        count = 0
        counting = self.head  # 从头结点开始计数
        while counting != None:
            count += 1
            counting = counting.get_next()
        return count

以上我们便实现了一个简单的链表。而关于双链表和循环链表呢,与单链表不同的是,双链表多了一个头指针,每个节点既可以指向上个节点也可以指向下个节点。循环链表的特点就是最后一个节点的指针指向头节点。

栈(Stack)

栈,也是一种线性的数据结构,他有个最经典的特征就是FILO(先进后出原则)。

先进后出是什么意思呢?打个比方,你现在有个羽毛球球桶,当你需要打球的时候,通常会在球桶顶端拿球,打完了放回去的时候,却不能放在顶端,只能从底部塞入,再次去拿球的时候,只能从顶部去拿新的球,这就是这就是栈。(下图有误,应该是从哪放就从哪拿)

如何用python实现栈呢?我们使用python中的list来实现十分简单。因为栈的特性,它的删除操作只能从栈顶开始删,所以移除的元素都是栈顶元素,添加元素也只能从栈底添加。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Stack:
    # 初始化栈为空列表
    def __init__(self):
        self.items = []

    # 判断栈是否为空
    def is_empty(self):
        return self.items == []

    # 返回栈顶
    def peek(self):
        return self.items[len(self.items) - 1]

    # 返回栈的大小
    def size(self):
        return len(self.items)

    # 入栈
    def push(self, item):
        self.items.append(item)

    # 出栈
    def pop(self, item):
        return self.items.pop()

队列(Queue)

队列,也是一种线性的数据结构,它和栈正好相反,它的特征是FIFO(先进先出原则)。

先进先出的意思是:打个比方,一个n节的火车进入了隧道,最先出隧道的那节车厢肯定就是最先入隧道的那节车厢了,这就是队列。

和上面一样,我们也可以使用list来实现一个队列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        return self.items.pop(0)

    def empty(self):
        return self.size() == 0

    def size(self):
        return len(self.items)

python里面也有自带queue(队列)这样一个模块,可以直接使用。(这里我们就不提python里面其他的队列了,例如LifoQueue,PriorityQueue)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import queue

q = queue.Queue(3)  # 调用构造函数,初始化一个大小为3的队列
print(q.empty())  # 判断队列是否为空,也就是队列中是否有数据
#  入队,在队列尾增加数据, block参数,可以是True和False 意思是如果队列已经满了则阻塞在这里,
# timeout 参数 是指超时时间,如果被阻塞了那最多阻塞的时间,如果时间超过了则报错。
q.put(13, block=True, timeout=5)
print(q.full())  # 判断队列是否满了,这里我们队列初始化的大小为3
print(q.qsize())  # 获取队列当前数据的个数
#  block参数的功能是 如果这个队列为空则阻塞,
#  timeout和上面一样,如果阻塞超过了这个时间就报错,如果想一只等待这就传递None
print(q.get(block=True, timeout=None))

#  queue模块还提供了两个二次封装了的函数,
q.put_nowait(23)  # 相当于q.put(23, block=False)
q.get_nowait()  # 相当于q.get(block=False)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python乱炖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Python数据结构系列】☀️《队列(顺序队列、链式队列、双端队列)》——知识点讲解+代码实现☀️
队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的**线性存储结构。 **
天道Vax的时间宝藏
2021/08/12
1.1K0
【Python数据结构与算法】线性结构小结
栈Stack维持了数据项后进先出LIFO的次序 stack的基本操作包括push,pop,isEmpty
ImAileen
2024/01/18
2170
【Python数据结构与算法】线性结构小结
Python数据结构——链表
链表(Linked List)是一种基本的数据结构,用于组织和管理数据。它是由一系列节点(Node)组成的数据结构,每个节点包含一个数据元素和指向下一个节点的引用。链表是一种非线性数据结构,与数组不同,它可以根据需要动态分配内存。
Echo_Wish
2023/11/30
1.2K0
以后再也不怕别人问「单链表」的问题啦。
在程序设计里,我们经常需要将同为某个类型的一组数据元素作为一个整体来使用,需要创建这种元素组,用变量来记录它们或者传入函数等等等等,「线性表」就是这样一组元素的抽象,它是某类元素的集合并且记录着元素之间一种顺序关系,是最基本的数据结构之一,在实际程序中运用非常广泛,比如 Python 中的 list 和 tuple 都可以看作是线性表的实现。
编程文青李狗蛋
2019/11/07
3320
以后再也不怕别人问「单链表」的问题啦。
数据结构(一)线性存储结构[通俗易懂]
int[] array = new int[] {0,1,2,3,4,5,6,7,8,9}; //数组的静态定义方式
全栈程序员站长
2022/07/30
1.6K0
数据结构(一)线性存储结构[通俗易懂]
Python学习日志之Python数据结构
   在程序中,同样的一个或几个数据组织起来,可以有不同的组织方式,也就是不同的存储方式,不同的组织方式就是不同的结构,我们把这些数据组织在一起的结构就叫做数据结构
py3study
2020/01/08
5590
探索单链表数据结构:理解与实现
在计算机科学和数据结构中,链表是一种基本且重要的数据结构,用于存储和组织数据。单链表是其中最简单的一种形式,它由一系列节点组成,每个节点都包含一个数据元素和一个指向下一个节点的指针。在这篇博客中,我们将深入探讨单链表的工作原理以及如何用代码实现它。
小馒头学Python
2023/11/25
2450
探索单链表数据结构:理解与实现
数据结构学习-python实现02--0402
今日继续进行了队列及单链表的学习。 一、队列,先进先出的有序结构。基础代码如下: # 基本队列的代码 class Queue: def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def enqueue(self, item): self.items.insert(0, item)
到不了的都叫做远方
2020/04/02
4270
数据结构 01
数据结构是计算机相关专业的基础课程,不管学什么编程语言,都要学习数据结构。接下来就一起来了解一下吧。
贪挽懒月
2019/02/20
8190
05-【久远讲算法】栈——后进先出的数据结构|流沙团队出品
在计算机科学中,链表是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针。
AI悦创
2021/11/08
5120
05-【久远讲算法】栈——后进先出的数据结构|流沙团队出品
数据结构与算法(一)
算法的概念 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。 算法是独立存在的一种解决问题的方法和思想。 对于算法而言,实现的语言并不重要,重要的是思想。 算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等),我们现在是在用Python语言进行描述实现。 算法的五大特性 输入: 算法具有0个或多个输入 输出: 算法至少有
酱紫安
2018/04/16
1.2K0
数据结构与算法(一)
数据结构笔记(二):栈、队列
4、栈可以用数组实现,也可以用链表实现。用数组实现的栈叫做顺序栈,用链表实现的栈叫做链式栈。
free赖权华
2020/05/21
3270
【苏州程序大白用2万字】解析数据结构和八大排序算法☀️《❤️记得收藏❤️》
我们的计算机实验室有 30 台计算机与一台打印机联网。当学生想要打印时,他们的打印任务与正在等待的所有其他打印任务“一致”。第一个进入的任务是先完成。如果你是最后一个,你必须等待你前面的所有其他任务打印。
苏州程序大白
2021/09/14
5180
【苏州程序大白用2万字】解析数据结构和八大排序算法☀️《❤️记得收藏❤️》
基础数据结构 例:栈、队列、链表、数据、字典、树、等【玩转腾讯云】
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,把另一端称为栈底。向一个栈插入新元素又称作 进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。
IT茂茂
2020/03/05
1.3K0
基础数据结构 例:栈、队列、链表、数据、字典、树、等【玩转腾讯云】
python基础--数据结构
python 提供了很多现成的数据结构类型,系统定义好的称为内置数据结构,比如:列表(list),元组(tuple),字典(dict),还有部分pythoh系统中没有直接定义,需要我们自己去定义实现的数据结构,称为python的扩展数据结构,比如,栈,队列等.
ypoint
2019/08/18
1K0
学完数据结构,队列到底有什么用?
什么数据结构与算法的概念、内容等基础性的内容网上太多了。为了让读者快速、深入理解Python常用数据结构作用及应用场景。
用户8949263
2022/11/07
1.3K0
学完数据结构,队列到底有什么用?
用Python实现数据结构之链表
链表与栈,队列不一样,它是由一个个节点构成的,每个节点存储着本身的一些信息,也存储着其他一个或多个节点的引用,可以从一个节点找到其他的节点,节点与节点之间就像是有链连在一起一样,这种数据结构就叫做链表
py3study
2020/01/17
6120
程序员必须掌握的八种数据结构
数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能;常用的数据结构有:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)、散列表(Hash)等;
绿水长流z
2024/06/13
3.1K0
程序员必须掌握的八种数据结构
探索Python数据结构与算法:解锁编程的无限可能
https://cloud.tencent.com/developer/article/2465647?shareByChannel=link
忆愿
2024/11/27
4440
探索Python数据结构与算法:解锁编程的无限可能
窥探数据结构的世界
数据结构是在计算机中组织和存储数据的一种特殊方式,使得数据可以高效地被访问和修改。更确切地说,数据结构是数据值的集合,表示数据之间的关系,也包括了作用在数据上的函数或操作。
用户1462769
2019/08/29
9690
窥探数据结构的世界
推荐阅读
相关推荐
【Python数据结构系列】☀️《队列(顺序队列、链式队列、双端队列)》——知识点讲解+代码实现☀️
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档