基于Python3的数据结构与算法 - 12 数据结构(列表和栈)

news2024/11/18 4:16:36

目录

一、引入

二、分类

三、列表

1. C语言中数组的存储方式

2. Python中列表的存储方式

四、栈

1. 栈的应用 -- 括号匹配问题


一、引入

  • 定义:数据结构是指相互之间存在着一种或多种关系的数据元素的集合该集合中数据元素之间的关系组成。
  • 简单来说,书记结果就是设计数据以何种方式组织并存储在计算机中。
  • 比如:列表、集合与字典等都是一种数据结构。
  • N.Wirth:‘“程序 = 数据结构 + 算法”

二、分类

数据结构按照其逻辑结构可分为线性结构、树结构、图结构。

  • 线性结构:数据结构中的元素存在一对一的相互关系(比如列表)。
  • 树结构:数据结构中的元素存在一对多的相互关系。(二叉树)
  • 图结构:数据结构中的元素存在多对多的相互关系。(地图)

三、列表

列表中的元素按照顺序存储

1. C语言中数组的存储方式

C语言中的数组需要指定数组的大小。

例如一个数组存整数,假如在32位机器上存放。

假如我们需要查找a[2],则a[2] : 100 +2 * 4 = 108 ,根据位置取出对应的元素。

数组与列表的区别:

  1. 数组元素类型要相同
  2. 数组长度固定

2. Python中列表的存储方式

Pyhton中列表存放的是对应的数据的地址

32位机器上,一个整数占4个字节,一个地址也占4个字节;64位机器上,一个整数占8个字节。

查找元素的复杂度为O(1)。

插入和删除对于列表来说都是O(n)的复杂度。

删除元素后,后面的数据所对应的地址会向前补;插入元素,后面的元素向后面挪动。

四、栈

定义:栈是一个数据集合,可以理解为只能在一端进行插入或删除操作的列表。

特点:后进后出LIFO(last-in, first-out)

栈的概念:栈顶、栈底

栈的基本操作

  • 进栈(压栈):push(相当于最上面再放一本书)
  • 出栈:pop(相当于取出最上面的一本书)
  • 取栈顶:gettop (查看最上面的元素的信息,但是不拿走)

我们可以创建一个class,来实现栈的功能,示例代码如下所示:

class Stack:
    def __init__(self):
        self.stack = []
        
    def push(self, element):   # 进栈存放元素
        self.stack.append(element)
        
    def pop(self):     # 出栈取元素
        return self.stack.pop()
    
    def get_top(self):   # 返回栈顶元素
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None

或者我们可以直接使用一般的列表结构即可实现栈:

  • 进栈: li.append
  • 出栈:li.pop
  • 取栈顶:li[-1] 

1. 栈的应用 -- 括号匹配问题

括号匹配问题:给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹配。

例如:

  • ()()[][]   匹配
  • ([{()}])   匹配
  • [](   不匹配
  • [(])  不匹配

示例代码如下所示:

class Stack:
    def __init__(self):
        self.stack = []
        
    def push(self, element):   # 进栈存放元素
        self.stack.append(element)
        
    def pop(self):     # 出栈取元素
        return self.stack.pop()
    
    def get_top(self):   # 返回栈顶元素
        if len(self.stack) > 0:
            return self.stack[-1]
        else:
            return None
        
    def is_empty(self):
        return len(self.stack) == 0


def brace_match(s):
    stack = Stack()
    match = {'}':'{', ')':'(', ']':'['}
    for ch in s:
        if ch in {'(', '[', '{'}:   # ch是左括号
            stack.push(ch)
        else:   # ch为右括号
            if stack.is_empty(): # 如果此时栈为空,也就是第一个字符不是左括号
                return False
            elif stack.get_top() == match[ch]:   # 取出栈顶元素,是否与match匹配
                stack.pop()  #  取出最后面一个与之相对于的左括号的元素
            else:   #不匹配 
                return False
    if stack.is_empty():
        return True
    else:
        return False

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

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

相关文章

portainer管理远程docker和docker-swarm集群

使用前请先安装docker和docker-compose,同时完成docker-swarm集群初始化 一、portainer-ce部署 部署portainer-ce实时管理本机docker,使用docker-compose一键拉起 docker-compose.yml version: 3 services:portainer:container_name: portainer#imag…

Docker上部署LPG(loki+promtail+grafana)踩坑复盘

Docker上部署LPG(lokipromtailgrafana)踩坑复盘 声明网上配置部署踩坑 声明 参考掘金文章:https://juejin.cn/post/7008424451704356872 版本高的用docker compose命令,版本低的用docker-compose 按照文章描述,主要准备…

UVA378 Intersecting Lines 题解

UVA378 Intersecting Lines 题解 怎么这么多点斜式邪教啊。 解法 在计算几何中,我们应该尽可能地避免使用浮点数的计算,尽可能地使用向量计算。 本篇题解默认读者具有向量基础。 为了方便讲解,我们将输入的四个点分别记作 A , B , C , …

本鲸多方位助力创业者高效对接创新创业机遇

在科技创新的浪潮中,创业者们不断探索着新的商业机会,寻求着创新创业的道路。然而,面对复杂多变的市场环境和激烈的竞争压力,如何高效对接创新创业机遇成为了摆在创业者面前的重要课题。 本鲸依托海南本鲸投资有限公司和重庆本鲸…

关于Vivado的实施过程、SDC和XDC约束支持、Vivado实施子流程、Tcl API支持脚本

关于Vivado的实施过程 AMD Vivado™设计套件可实现以下AMD设备体系结构:AMD Versal™自适应计算加速平台(自适应SoC),AMDUltraScale™、AMD UltraScale™和AMD 7系列FPGA。各种设计来源如下支持,包括: •…

WebGPU vs. 像素流

在构建 Bzar 之前,我们讨论过我们的技术栈是基于在云上渲染内容的像素流,还是基于使用设备自身计算能力的本地渲染技术。 由于这种选择会极大地影响项目的成本、可扩展性和用户体验,因此在开始编写一行代码之前,从一开始就采取正确…

typeorm-入门

简述 typeorm是一个数据库orm框架,在nestjs官网中有提到,可以充分发挥利用typescript的特性,当然也支持js其中涉及的概念包括 DataSource 数据源,Connection 连接数据库Entity 实体,实体类映射数据库表Relation 关系…

30个炫酷光效视频转场PR模板剪辑素材下载

视频转场Premiere模板,包含30个炫酷光效视频转场过渡效果PR项目模板下载。 适用软件:Premiere Pro 2023 | 分辨率:3840x2160 (4K) | 无需插件 | 文件大小:56.33MB 来自PR转场,下载地址:https://prmuban.com…

Windows下Node.js安装保姆级教程

一、Node.js 下载 访问Node.js官网,点击下载Node.js 下载完成后即可在下载文件中查看安装包 二、安装 一)点击安装包开始安装,进入Weclcome界面点击Next 二)勾选同意协议,点击Next 三)根据需要选择安装路…

Neo4j安装 Linux:CentOS、openEuler 适配langchain应用RAG+知识图谱开发 适配昇腾910B

目录 Neo4j下载上传至服务器后进行解压运行安装JAVA再次运行在windows端打开网页导入数据 Neo4j下载 进入Neo4j官网下载页面 向下滑动找到 Graph Database Self-Managed 选择 社区版(COMMUNITY) 选择 Linux / Mac Executable Neo4j 5.17.0 (tar) 单机下…

Linux第72步_使用“新字符设备的一般模板”编写LED驱动

使用“新字符设备的一般模板”编写LED驱动,使用寄存器直接开关灯。 1、创建LED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/” 输入“ls回车”,查看“/home/zgq/linux/Linux_Drivers/” 输入“mkdi…

egg如何写单元测试

优秀的代码需要有单元测试进行质量保证,每个测试用例都给应用的稳定性提供了一层保障。 测试目录结构 我们约定 test 目录为存放所有测试脚本的目录,测试所使用到的 fixtures 和相关辅助脚本都应该放在此目录下。 测试文件的目录和我们需要测试的文件目…

unicloud where 使用

where介绍 在uniCloud中,WHERE是一个用于指定查询条件的关键字。它允许用户根据特定的条件来筛选和查询云数据库中的数据。WHERE语句的基本语法格式是WHERE condition,其中condition表示查询条件,可以是一个或多个逻辑表达式组成的条件。 在…

深入了解304缓存原理:提升网站性能与加载速度

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

探索HTTP协议:网络通信的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性

官方网址 源码:https://kafka.apache.org/downloads 快速开始:https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程:主线程只负责组织消息,如果是同步发送会阻塞,如果是异…

web基础04-flex布局

1.概述 Flexbox​ 是 ​flexible box​ 的简称(注:意思是“​灵活的盒子容器​”),是 CSS3 引入的新的布局模式。 它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来。 它之所以被称…

C++错误总结(1)

1.定义函数类型时,如果没有返回值,用void void swap(int &x, int &y){ int tem x; x y; y tem; } 2.输入时,不加换行符 cin >> a >> b >> c >> endl ;(红色标记的是错误的部分) 3.【逆序出入…

【LeetCode】升级打怪之路 Day 16:二叉树题型 —— 二叉树的构造

今日题目: 654. 最大二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树889. 根据前序和后序遍历构造二叉树 目录 LC 654. 最大二叉树 【easy】 Problem:根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐LC 105. 从前序与中…