• 数据结构与算法基础-(4)


    🌈write in front🌈
    🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
    🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️
    📝个人主页:Aileen_0v0🧸—CSDN博客
    🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
    📣系列专栏:Aileen_0v0🧸的数据结构与算法学习系列专栏🌸——CSDN博客
    🗼我的格言:"没有罗马,那就自己创造罗马💫~" 

    回顾💫

    上次讲到Python中的两种内置数据类型的大O记法以及四种数学问题:P,NP,NPC,NPC-Hard四类问题以及相关的数学问题故事

    如果有所遗忘,或者是感兴趣的小伙伴可以点击🔗👇数据结构与算法基础-(3)_Aileen_0v0的博客-CSDN博客

     转到相关文章进行阅读~

    线性结构(Linear Structure)的概念🍡

    线性结构:是一种有序数据项的集合,其中每个数据项都有唯一前驱和后继

     两端称呼并非关键,不同的数据结构的关键区别在于数据的增减方式

    有的数据结构只允许数据项从一端添加,而有的数据结构则允许数据项从两端移除!

     栈Stack🍰

    一种有次序的数据项集合,在栈中,数据项加入和移除都仅发生在同一端

    这一端叫栈“顶top”,另一端叫栈“底base”

    日常生活中有很多栈的应用

    盘子、托盘、书堆等

    距离栈底越近的数据项,留在栈中的时间就越长.

    最新加入栈的数据项会被最先移除

    这种次序通常称为"后进先出LIFO": Last in First out

    这是一种基于数据项保存时间的次序,时间越短的离栈顶越近,而时间越长离栈底越近.

    栈的特性:反转次序🍭

    上图为python原生数据对象形成的栈

    进栈和出栈的次序正好相反.

    抽象数据类型(ADT -  Abstract Data Types)  ------------> " 栈 "  是一个有次序的数据集,每个数据仅从" 栈顶 " 一端加入到数据集中,从数据集中移除,栈具有后进先出LIFO的特性.

    " 栈 " 的操作 🍬

    Stack( ) : 创建一个空栈, 不包含任何数据

    push (item) : 将 item 加入栈顶 , 无返回值

    pop ( ) : 将栈顶数据项移除, 并返回, 被修改

    peak ( ) : "窥视" 栈顶数据项, 返回栈顶的数据项但不移除, 栈不被修改.

    isEmpty ( ) : 返回栈是否为空栈

    size ( ) : 返回栈中有多少个数据项

    考点1:

     用Python实现ADT Stack🧁

    注意细节: Stack 的两端对应list设置

    可以将 List 的任意一端 ( index = 0 或者 - 1 )   --->设置为栈

    我们选用 List 的末端 ( index = -1 ) 作为栈顶

    这样栈的操作就可以通过对 list 的append 和 pop 来实现~

     

     

    python中的赋值语句🍩


    if语句,当条件成立时运行语句块。经常与else, elif(相当于else if)配合使用。
    for语句,遍列列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。
    while语句,当条件为真时,循环运行语句块。
    try语句。与except, finally, else配合使用处理在程序运行中出现的异常情况。
    class语句。用于定义类型。
    def语句。用于定义函数和类型的方法。
    pass语句。表示此行为空,不运行任何操作。
    assert语句。用于程序调适阶段时测试运行条件是否满足。
    with语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加锁,然后在语句块运行退出后释放锁。
    yield语句。在迭代器函数内使用,用于返回一个元素。
    raise语句。抛出一个异常。
    import语句。导入一个模块或包。常用写法:from module import name, import module as name, from module import name as anothername

    时间复杂度基本单位是: 赋值语句

    左为栈顶,时间复杂度为O(n) 🍨

    1. #左边为顶,右边为低
    2. class Stack:
    3. def __init__(self):
    4. self.items = []
    5. def isEmpty(self):
    6. return self.items == []
    7. def push(self,item):
    8. self.items.insert(0,item)
    9. def pop(self):
    10. return self.items.pop(0)
    11. def peek(self):
    12. return self.items[0]
    13. def size(self):
    14. return len(self.items)

     

    时间复杂度基本单位是: 赋值语句

    当左边为栈顶时,当我们往里面加入(pop)元素时,我们会发现后面的每个元素都会向后移一位,就像是排队的时候有个人突然插在前面,后面的人不得不向后退一位,他们等待的时间就会更长.如果有n个元素就会移动n位,所以当左边作为栈顶时,这个栈的时间复杂度是O(n).

    以下是左边作为栈顶时插入元素的示意图


    右为栈顶,时间复杂度O(1) 🍧

    1. # 左边为低,右边为顶--->更高效
    2. class Stack:#Stack---->ADT
    3. def __init__(self):
    4. self.items =[]
    5. def isEmpty(self):
    6. return self.items == []
    7. # 满足这些属性(行为)的是栈
    8. def push(self,item):
    9. self.items.append(item)
    10. def pop(self):
    11. return self.items.pop()
    12. def peek(self):
    13. return self.items[len(self.items)-1]
    14. #
    15. def size(self):
    16. return len(self.items)
    17. s = Stack()

     

    当右边为栈顶时,我们会发现当我们往里面pop元素时,其它元素的位置不会发生变化,就像是排队后面来的人就排在队伍的后面,所以当我们以右边作为栈顶时,时间复杂度为O(1). 

    以右为栈顶,插入元素示意图

     

    总结🍻

    不同内置操作时间复杂度的查看网址:

    TimeComplexity - Python Wiki

    🐬今天的线性结构中栈的学习就到这里啦~🐬

    🐬觉得通俗易懂的家人们给个三连吧~🐬

    🐬你的鼓励是我前进的动力💓~ 🐬

  • 相关阅读:
    学术报告系列(六) - Autonomous Driving on the journey to full autonomy
    WPF---Grid布局讲解
    专业五月考自测
    .NET中如何实现高精度定时器
    钉钉统计部门个人请假次数go
    Java面向对象编程
    文本分类微调技巧实战2.0
    通过安装GVM 安装GO 操作步骤
    ES6——知识点记录
    K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品 nerdctl
  • 原文地址:https://blog.csdn.net/Aileenvov/article/details/133384404