数据结构基础 ——栈和队列(三)

news2024/11/24 15:32:37

一、物理结构和逻辑结构

  • 物理结构就是看得见,摸得着。而数组和链表,就是内存中实实在在的存储结构。
  • 逻辑结构就是看不见、摸不着。

二、  栈(stack)

    栈(stack)是一种线性数据结构,栈中的元素只能先进后出 (First In Last Out,简称FILO)。最早进入的元素存放的位置叫作栈底(bottom),最后进入的元素存放的位置叫作栈顶(top)。 

栈这种数据结构既可以用数组来实现,也可以用链表来实现。

 

栈的基本操作

  1.入栈
   入栈操作(push)就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会成为新的栈顶。

2.出栈 

出栈操作(pop)就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈元素的前一个元素将会成为新的栈顶。 

 

     在Python语言中,列表很好地实现了栈的功能,append方法相当于入栈,pop方法相当于出栈。由于栈操作的代码实现相对简单。

ll=[1,2,3,4,5,6]
#入栈
ll.append(50)
ll.append(60)
print(ll)
#出栈第一个
ll.pop(0)
#出栈最后一个
ll.pop(len(ll)-1)
print(ll)

四、队列

     队列(queue)是一种线性数据结构,队列中的元素只能先进先出(First In First Out,简称FIFO)。队列的出口端叫作队头(front),队列的入口端叫作队尾( rear) 。
与栈类似,队列这种数据结构既可以用数组来实现,也可以用链表来实现。

队列的基本操作

1、入队

入队( enqueue)就是把新元素放入队列中,只允许在队尾的位置放入元素,新元素的下一个位置将会成为新的队尾。

2、出队

出队操作(dequeue)就是把元素移出队列,只允许在队头一侧移出元素,出队元素的后一个元素将会成为新的队头。

如果不断出队,队头左边的空间失去作用,那队列的容量岂不是越来越小?

那么就使用数组实现的队列可以采用循环队列的方式来维持队列容量的恒定。

      一直到(队尾下标+1)%数组长度=队头下标时,代表此队列真的已经满了。需要注意的是,队尾指针指向的位置永远空出1位,所以队列最大容量比数组长度小1。

#用列表实现循环队列
class MyQueue:
    '''初始化'''
    def __init__(self, capacity):
        self.list = [None] * capacity #队列长度
        self.head = 0 #头指针
        self.tail = 0 #尾指针

    #入队操作
    def enqueue(self, element):
        #循环队列判断队列是否满
        if (self.tail + 1) % len(self.list) == self.head:
            raise Exception("队列已满")
        self.list[self.tail] = element
        self.tail = (self.tail + 1) % len(self.list)

    #出队操作
    def dequeue(self):
        #循环队列判断队列是否为空,如果为空。
        if self.tail == self.head:
            raise Exception("队列为空")
        dequeue_element = self.list[self.head]
        self.head = (self.head + 1) % len(self.list)
        return dequeue_element

    #打印循环队列内的元素
    def show(self):
        i = self.head  #队头
        while i is not self.tail:
            print(self.list[i],end="\t")
            i = (i + 1) % len(self.list)

 (1)入队已满

if __name__ == '__main__':
    #队列对象
    myQueue = MyQueue(3)
    #入队
    myQueue.enqueue(3)
    myQueue.enqueue(4)
    myQueue.enqueue(5)
    myQueue.enqueue(6)

 (2) 入队,再出队OK

if __name__ == '__main__':
    #队列对象
    myQueue = MyQueue(6)
    #入队
    myQueue.enqueue(3)
    myQueue.enqueue(4)
    myQueue.enqueue(5)
    myQueue.enqueue(6)
    #出队
    print(myQueue.dequeue())
    print(myQueue.dequeue())
    print('*'*20)

 

(3) 入队,再出队,队列为空

if __name__ == '__main__':
    #队列对象
    myQueue = MyQueue(6)
    #入队
    myQueue.enqueue(3)
    #出队
    print(myQueue.dequeue())
    print(myQueue.dequeue())

 (4) 入队,再出队

if __name__ == '__main__':
    #队列对象
    myQueue = MyQueue(6)
    #入队
    myQueue.enqueue(3)
    myQueue.enqueue(4)
    myQueue.enqueue(5)
    myQueue.enqueue(6)

    #出队
    print(myQueue.dequeue())
    print(myQueue.dequeue())
    print('*'*20)

    #再入队
    myQueue.enqueue(10)
    myQueue.enqueue(20)

    #显示
    myQueue.show()

 

总之:入队和出队的时间复杂度,也同样是O (1) 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub repository - Watch - Star - Fork - Follow

GitHub repository - Watch - Star - Fork - Follow References 眼睛图标旁边写着 Watch 字样。点击这个按钮就可以 Watch 该仓库,今后该仓库的更新信息会显示在用户的公开活动中。Star 旁边的数字表示给这个仓库添加 Star 的人数。这个数越高,代表该仓库…

【Java】第十五届蓝桥杯JavaB组第一道填空题

#【Java】第十五届蓝桥杯JavaB组第一道填空题 大家好 我是寸铁👊 总结了一篇【Java】第十五届蓝桥杯JavaB组第一道填空题文章 喜欢的小伙伴可以点点关注 💝 Java B组 第一道填空题题解如下:

Excel从零基础到高手【办公】

第1课 - 快速制作目录【上篇】第1课 - 快速制作目录【下篇】第2课 - 快速定位到工作表的天涯海角第3课 - 如何最大化显示工作表的界面第4课 - 给你的表格做个瘦身第5课 - 快速定位目标区域所在位置第6课 - 快速批量填充序号第7课 - 按自定义的序列排序第8课 - 快速删除空白行第…

计算机视觉异常检测——PatchCore面向全召回率的工业异常检测

1. 概述 异常检测问题在工业图像数据分析中扮演着至关重要的角色,其目的是从大量正常数据中识别出异常行为或模式。这一任务的挑战在于,正常数据的样本相对容易获取,而异常情况却因其稀有性和多样性而难以收集。为了解决这一问题&#xff0c…

【C++类和对象】上篇

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

MDK平台 - Code, RO-data , RW-data, ZI-data详解

文章目录 1 . 前言2 . Code, RO-data , RW-data, ZI-data解析3 . RAM上电复位4 . 细节扩展5 . 总结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 MDK编译后,会列出Code, RO-data , RW-data, ZI-data,以下解析…

YOLO-World: Real-Time Open-Vocabulary Object Detection 简介+安装+运行+训练(持续更新)

前言 YOLO_WORLD太牛了!!众所周知,传统是视觉目标检测一旦训练好后,如果我们需要增加新的识别目标的话,必须得重新训练模型。在生产中如果经常要新增检测目标,对时效性影响很大,而且随着数据量…

【前端面试3+1】12 toktn验证过程、面向对象特性、webpack和vite的区别、【字符串中的第一个唯一字符】

一、token验证过程 用户登录:用户提供用户名和密码进行登录。服务器验证:服务器接收到用户提供的用户名和密码,进行验证。生成token:如果用户名和密码验证通过,服务器会生成一个token,通常包含一些加密的信…

代码随想录阅读笔记-回溯【复原IP地址】

题目 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201…

最新AI模型与Python技术处理和分析气候数据:ChatGPT在大气科学领域建模、数据分析、可视化与资源评估中的高效应用及论文写作

本文深度探讨人工智能在大气科学中的应用,特别是如何结合最新AI模型与Python技术处理和分析气候数据。课程介绍包括GPT-4等先进AI工具,旨在帮助大家掌握这些工具的功能及应用范围。课程内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等…

力扣2923、2924.找到冠军I、II---(简单题、中等题、Java、拓扑排序)

目录 一、找到冠军I 思路描述: 代码: 二、找到冠军II 思路描述: 代码: 一、找到冠军I 一场比赛中共有 n 支队伍,按从 0 到 n - 1 编号。 给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足…

DNF手游攻略:2024新手攻略大全

在《DNF手游》的世界中,前期阶段对于新手玩家来说至关重要。以下是一份综合整理的新手攻略,帮助玩家快速适应游戏并取得进展。 1. 角色建立策略: 在前期,建议玩家建立3个角色,包括1个大号和2个小号。大号可以根据个人喜…

从电子病历(EMRs)构建医学知识图谱

从电子病历 EMRs 构建医学知识图谱 提出背景传统的三元组结构本研究采用的四元组结构第四元作用第四元类型以往的方法本研究的方法 大威天龙八 论文:Real-world data medical knowledge graph: construction and applications 提出背景 本研究在中国一家三甲医院的…

【GD32】MQ-5液化气检测传感器

2.33 MQ-5液化气检测传感器 MQ-5气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sno2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为该气体浓度相对应的输出信号。…

ExpressLRS硬件实测性能分析

ExpressLRS硬件实测性能分析 1. 源由2. 远航测试3. 实验室测试3.1 芯片RSSI与实测功率差异3.2 SNR信噪比稳定3.3 140db衰减器衰减,40个频点信号稳定 4. 外场测试4.1 无屏蔽样品4.2 有屏蔽样品4.3 有屏蔽vs无屏蔽样品 5. 估算6. 总结7. 补充说明 -- 50mW视频 1. 源由…

1.3 字符设备驱动

1、字符设备驱动工作原理 2、file_operations结构体 struct file_operations { struct module *owner; //拥有该结构的模块的指针,一般为THIS_MODULES loff_t (*llseek) (struct file *, lof…

【日常记录】【CSS】生成动态气泡小球

文章目录 1、分析2、实现 1、分析 核心有两点&#xff0c;通过这两个不一样就可以实现每个小球的颜色、动画时间不一致 给每个元素都设置一个css 变量 bgc 用于控制每一个小球的颜色给每个元素都设置一个css 变量 duration 用于控制每一个小球的时间 2、实现 <!DOCTYPE ht…

java中的线程通讯和线程池,Callable任务

线程通讯&#xff1a; 在多线程中&#xff0c;某个线程进入“等待状态”时&#xff0c;需要某个线程来唤醒 等待方法&#xff1a; wait()//无线等待 wait(long 毫秒)//计时等待 注意&#xff0c;调用wait方法&#xff0c;会自动释放掉锁资源 处于wait状态只能由其他线程唤醒 唤…

信创产品适配的前因后果

“信创”的本意是指“信息技术应用创新”。这个概念最早来源于“信创工委会”&#xff08;信息技术应用创新工作委员会&#xff09;&#xff0c;一个由24家专业从事软硬件关键技术研究及应用的国内单位&#xff0c;在2016年共同发起成立的非营利性社会组织。近些年来&#xff0…

GitHub repository - commits - branches - releases - contributors

GitHub repository - commits - branches - releases - contributors 1. commits2. branches3. releases4. contributorsReferences 1. commits 在这里可以查看当前分支的提交历史。左侧的数字表示提交数。 2. branches 可以查看仓库的分支列表。左侧的数字表示当前拥有的分…