【Python数据结构与算法】线性结构小结

简介: 【Python数据结构与算法】线性结构小结

线性数据结构Linear DS

作用:将数据项以某种线性的次序组织起来

1.栈Stack


栈Stack维持了数据项后进先出LIFO的次序

stack基本操作包括push,pop,isEmpty

栈的两种实现

1.左为栈顶,时间复杂度为O(n)
#左边为顶,右边为低
class Stack:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def push(self,item):
        self.items.insert(0,item)
    def pop(self):
        return self.items.pop(0)
    def peek(self):
        return self.items[0]
    def size(self):
        return len(self.items)
2.右为栈顶,时间复杂度O(1)  
# 左边为低,右边为顶--->更高效
class Stack:#Stack---->ADT
    def __init__(self):
        self.items =[]
    def isEmpty(self):
        return self.items == []
# 满足这些属性(行为)的是栈
    def push(self,item):
        self.items.append(item)
    def pop(self):
        return self.items.pop()
    def peek(self):
        return self.items[len(self.items)-1]
    #
    def size(self):
        return len(self.items)
s = Stack()

链接👉:http://t.csdnimg.cn/hYT1x

2.队列Queue

队列Queue维持了数据项先进先出FIFO的次序

queue基本操作包括enqueue, dequeue,isEmpty 有助于构建时序模拟

书写表达式的方法前缀prefix、中缀infix和后缀postfix三种由于栈结构具有次序反转的特性,所以栈结构适合用于开发表达式求值和转换的算法

“模拟系统”可以通过一个对现实世界问题进行抽象建模,并加入随机数动态运行为复杂问题的决策提供各种情况的参考队列queue可以用来进行模拟系统的开发

链接👉:http://t.csdnimg.cn/3xKyl

3.双端队列Deque

双端队列Deque可以同时具备栈和队列的功能

deque的主要操作包括addFront,addRear, removeFront, removeRear, isEmpty

#创建一个双端队列(Dequeue)
class Dequeue:
    #定义一个初始化函数然后创建一个空列表用于传递数据items
    def __init__(self):
        self.items = []
    #判断列表是否为空
    def isEmpty(self):
        return self.items == []
     #在队首加入元素items
    def addFront(self,item):
        self.items.append(item)
    #在队尾加入元素items
    def addRear(self,item):
        self.items.insert(0,item)
    #从队首移除数据,返回值为移除数据项
    def removeFront(self):
        return self.items.pop()
    #从队尾移除数据,返回移除数据项
    def removeRear(self):
        return self.items.pop(0)
    #判断列表是否为空
    def isEmpty(self):
        return self.items == []
    #返回Dequeue中包含的数据项的个数
    def size(self):
        return len(self.items)
#palindrome - 回文检查
def  pal_checker (ps):
    #实例化对象
    d = Dequeue()
    for char in  ps:
        d.addRear(char)
    #假设元素左右相等
    still_equal = True
    #依次取出首尾元素进行判断,然后再判断它是否满足 :
    # 奇数个元素的时候,双端队列里面还剩下一个元素
    #偶数个元素的时候,双端队列里面没有元素
    while d.size() > 1 and still_equal :
        #从队首取出一个元素
        first = d.removeFront()
        #从队尾取出一个元素
        last = d.removeRear()
        if first != last:
            still_equal = False
    return still_equal
print(pal_checker ("上海自来水来自海上"))
print(pal_checker ("110110"))

链接👉:http://t.csdnimg.cn/GxnBy

4.列表List

列表List是数据项能够维持相对位置的数据集

# 通过链表实现 无序表-列表
#列表 和 链表 都是无序表 unordered list
#实现链表
class Node:
    def __init__(self,init_data):
        self.data = init_data
        self.next = None
    #获得数据项
    def get_data(self):
        return self.data
    #获得节点
    def get_next(self):
        return self.next
    #设置数据项
    def set_data(self,new_data):
        self.data = new_data
    #设置节点
    def set_next(self,new_next):
        self.next = new_next
#结点示例
temp = Node(93)
print(temp.get_data())

链接👉:http://t.csdnimg.cn/nXztJ

5.链表

链表的实现可以保持列表维持相对位置(保证逻辑顺序)的特点,而不需要连续的存储空间

链表实现时,其各种方法,对链表头部head需要特别的处理 

a.无序链表的实现

# 通过链表实现 无序表-列表
#列表 和 链表 都是无序表 unordered list
#实现链表 -- 链表相当于火车(顺藤摸瓜结构,如果放在链表后面,找那个车厢需要从头开始往后找)
class Node:#结点Node相当于车厢
    def __init__(self,init_data):
        self.data = init_data
        self.next = None
    #获得数据项
    def get_data(self):
        return self.data
    #获得节点
    def get_next(self):
        return self.next
    #设置数据项
    def set_data(self,new_data):
        self.data = new_data#属性
    #设置节点
    def set_next(self,new_next):
        self.next = new_next#属性
#结点示例
temp = Node(93)
temp2 = Node(17)
temp3 = Node(77)
print(temp.get_data())
print(temp2.get_data())
print(temp3.get_data())
# 链表:1.有序表 2.无序表
#链表实现: 无序表 UnorderedList
#设立一个属性head , 保存对对第一个节点的引用
#空表的 head 为 None
class UnorderedList:
    def __init__(self):
        self.head = None
# mylist = UnorderedList()
# print (mylist.head)
    #为item数据项生成一个结点-Node 叫做item
    def add(self,item):
        #然后将这个结点命名为临时变量
        temp = Node(item)
        #将下一个临时结点设置为表头
        temp.set_next(self.head)
        #表头指向新增加的临时结点
        self.head = temp
    def size(self):
        #当前节点设为表头第一个节点
        current = self.head
        count = 0
        while current != None:
            count += 1
            #将当前节点设为下一个结点的结点,循环往复
            current = current.get_next()
                #返回结点的个数
        return count
    def search(self,item):
        current = self.head
        found = False
        while current != None and not found:
            #判断当前节点数据项是否等于我想要找的数据
            if current.get_data() == item:
                found = True
            else:
                current = current.get_next()
        return found
    def remove(self,item):#删除找到的元素--引用两个指针当前和上继指针
        current = self.head
        previous = None
        found = False
        #先判断是不是我要找的那个元素
        while not found:
            if current.get_data == item:
                found = True
            else:
                #通过current的指针给初始没有指针的previous指路
                previous = current
                #然后current指针继续往下走
                current = current.get_next
# 如果中间位置找不到,那我们再判断表头
#当前删除的车厢部位值item 位于头部时,可以利用 previous 指向空
        if previous == None:#当前想要删除的是不是车头处的元素
            self.head = current.get_next()
        else:
            previous.set_next(current.get_next())#删除的是中间元素
    def traverse(self):
        current = self.head
        while current != None:
            print(current.get_data())
            current = current.get_next()
#实例化无序表:
ll  = UnorderedList()
# 加入新节点
ll.add(7)
ll.add(9)
ll.add(6)
ll.add(8)
ll.add(10)
print(ll.search(1000))
ll.traverse()

b.有序链表的实现

class Node:#结点Node相当于车厢
    def __init__(self,init_data):
        self.data = init_data
        self.next = None
    #获得数据项
    def get_data(self):
        return self.data
    #获得节点
    def get_next(self):
        return self.next
    #设置数据项
    def set_data(self,new_data):
        self.data = new_data#属性
    #设置节点
    def set_next(self,new_next):
        self.next = new_next#属性
class Orderedlist:
    def __init__(self):
        self.head = None
    def search(self,item):
        current = self.head
        found = False
        stop = False
        while current != None and not found and not stop:
            if current.get_data() == item:
                found = True
            else:
                if current.get_data()  > item:
                    stop = True
                else:
                    current = current.get_next()
        return found
    def add(self,item):
        current = self.head#指针1
        previous = None#p2
        stop = False
        while current != None and not stop:
            #发现插入位置
            if current.get_data() > item:
                stop = True
            else:
                previous = current
                current = current.get_next()
        temp = Node(item)
        #插在表头
        if previous == None:
            temp.set_next(self.head)
            self.head = temp
        #插在表中
        else:
            temp.set_next(current)
            previous.set_next(temp)
    def size(self):
        current = self.head
        count = 0
        while current != None:
            count += 1
            current = current.get_next()
        return count
    def remove(self, item):
        current = self.head
        previous = None
        found = False
        while not found and current != None:
            if current.get_data() == item:
                found = True
            else:
                previous = current
                current = current.get_next()
        if found:
            if previous == None:
                self.head = current.get_next()
            else:
                previous.set_next(current.get_next())
    def traverse(self):
        current = self.head
        while current != None:
            print(current.get_data())
            current = current.get_next()
ol = Orderedlist()
ol.add(7)
ol.add(9)
ol.add(6)
ol.add(8)
ol.add(10)
print(ol.search(6))
ol.traverse()

链接👉:http://t.csdnimg.cn/uTilE

目录
相关文章
|
1月前
|
数据采集 机器学习/深度学习 数据可视化
【优秀python web系统毕设】基于python的全国招聘数据分析可视化系统,包括随机森林算法
本文介绍了一个基于Python的全国招聘数据分析可视化系统,该系统利用数据挖掘技术、随机森林算法和数据可视化技术,从招聘网站抓取数据,进行处理、分析和预测,帮助用户洞察招聘市场,为求职者和企业提供决策支持。
|
28天前
|
测试技术 索引 Python
|
1天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
30 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
1天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
30 11
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
2天前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
17 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
12天前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
48 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
20小时前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
22 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
9天前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
24 9
|
2天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
11 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
10天前
|
存储 算法 测试技术
预见未来?Python线性回归算法:数据中的秘密预言家
【9月更文挑战第11天】在数据的海洋中,线性回归算法犹如智慧的预言家,助我们揭示未知。本案例通过收集房屋面积、距市中心距离等数据,利用Python的pandas和scikit-learn库构建房价预测模型。经过训练与测试,模型展现出较好的预测能力,均方根误差(RMSE)低,帮助房地产投资者做出更明智决策。尽管现实关系复杂多变,线性回归仍提供了有效工具,引领我们在数据世界中自信前行。
27 5