返回顶部
首页 > 资讯 > 后端开发 > Python >Python数据结构与算法中的栈详解(1)
  • 113
分享到

Python数据结构与算法中的栈详解(1)

2024-04-02 19:04:59 113人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是栈构建一个栈总结什么是栈 栈有时也被称作“下推栈”。它是有序集合,添加操作和移除操作总发生在同一端,即栈的 “顶端&rdquo

什么是栈

有时也被称作“下推栈”。它是有序集合,添加操作和移除操作总发生在同一端,即栈的 “顶端”,栈的另一端则被称为 “底端”。所以最新添加的元素将被最先移除,而且栈中的元素离底端越近,代表其在栈中的时间越长。

这种排序原则被称作LIFO(last-in first-out),即后进先出它提供了一种基于在集合中的时间来排序的方式。 最近添加的元素靠近顶端,旧元素则靠近底端。

栈的例子在日常生活中比比皆是。几乎所有咖啡馆都有一个由托盘或盘子构成的栈,你可以从顶部取走一个,下一 个顾客则会取走下面的托盘或盘子。

考虑到栈的反转特性,我们可以想到在使用计算机时的一些例子。例如,每一个浏览器都有返回按钮。当我们从一个网页跳转到另一个网页时,这些网页——实际上是URL,都被存放在一个栈中。当前正在浏览的网页位于栈的顶端,最早浏览的网页则位于底端。如果点击返回按钮, 便开始反向浏览这些网页。

构建一个栈

如前所述,栈是元素的有序集合,添加操作与移除操作都发生在其顶端。栈的操作顺序是LIFO,它支持以下操作:

  • 将一个元素添加到栈的顶端
  • 将栈顶端的元素移除
  • 返回栈顶端的元素
  • 返回栈中元素的数目

明确了栈的基本特性之后,我们开始用代码构建它。在面向对象编程语言中(以python为例),每当需要在Python中实现像栈这样的抽象数据类型时 ,就可以通过创建一个类的途径实现它,且数据类型的特性、操作方法等也可以通过在类中定义方法实现。

我们来明确一下这个类的具体方法:

  • 创建一个空栈。它不需要参数,且会返回一个空栈。 Stack()
  • 将一个元素添加到栈的顶端。它需要一 个参数item ,且无返回值。 push(item)
  • 将栈顶端的元素移除。它不需要参数,但会返回顶端的元素,并且修改栈的内容。 pop()
  • 返回栈顶端的元素,但是并不移除该元素。 它不需要参数,也不会修改栈的内容。 peek()
  • 返回栈中元素的数目。它不需要参数,且会返回一个整数。 size()
  • 检查栈是否为空。它不需要参数,且会返回一个布尔值。 isEmpty()
  • 打印这个栈/列表,它不需要参数,会输出栈的内容。 look()

​因为栈是元素的集合,所以完全可以利用Python提供的强大、简单的原生集合来实现。这里,我们将使用列表。 列表的最左端将用来表示栈底,最右边将用来表示栈顶:

class Stack:
  # 定义一个列表/构造一个栈
  def __init__(self):
  	self.items = []
  	print("你创造了一个栈!")
  def isEmpty(self):
    return self.items == []
  def look(self):
    print(self.items)
  def push(self, item):
    self.items.append(item)
    print("你给栈顶加了个%s" % 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)

以下展示了栈的操作及其返回结果:

在这里插入图片描述

值得注意的是,也可以选择将列表的头部(左边)作为栈的顶端。 不过在这种情况下,便无法直接使用列表的pop方法和append方法,而必须要用列表的pop方法和insert方法显式地访问下标为0的元素,即列表中的第1个元素。以下代码展现了这种方式:

class Stack:
  def __init__(self):
  	self.items = []
  def isEmpty(self):
    return self.items == []
  def look(self):
    print(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)

尽管上述两种实现都可行,但是二者在性能方面肯定有差异。append 方法和 pop 方法的时间复杂度都是 o ( 1 ) o(1) o(1),这意味着不论栈中有多少个元素, 第一种实现中的 push 操作和 pop 操作都会在恒定的时间内完成。第二种实现的性能则受制于栈中的元素个数,这 是因为 insert(0) 和 pop(0) 的时间复杂度都是 o ( n ) o(n) o(n),元素越多就越慢。

显而易见,尽管两种实现在逻辑上是相等的,但是它们在进行基准测试时耗费的时间会有很大的差异。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

--结束END--

本文标题: Python数据结构与算法中的栈详解(1)

本文链接: https://lsjlt.com/news/141894.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python数据结构与算法中的栈详解(1)
    目录什么是栈构建一个栈总结什么是栈 栈有时也被称作“下推栈”。它是有序集合,添加操作和移除操作总发生在同一端,即栈的 “顶端&rdquo...
    99+
    2024-04-02
  • Python数据结构与算法中的栈详解
    目录0. 学习目标1. 栈的基本概念1.1 栈的基本概念1.2 栈抽象数据类型1.3 栈的应用场景2. 栈的实现2.1 顺序栈的实现2.1.1 栈的初始化2.1.2 求栈长2.1.3...
    99+
    2024-04-02
  • Python数据结构与算法中的栈详解(2)
    目录匹配括号匹配符号总结匹配括号 接下来,我们使用栈解决实际的计算机科学问题。​ 比如我们都写过这样所示的算术表达式, ( 5 + 6 ) ∗ ( 7 + 8 ) / ...
    99+
    2024-04-02
  • Python数据结构与算法中的栈详解(3)
    目录前序、中序和后序表达式是什么?我们为什么要学习前/后序表达式?从中序向前序和后序转换用Python实现从中序表达式到后序表达式的转换​计算后序表达式总结前序、中序和后序表达式是什...
    99+
    2024-04-02
  • Python数据结构与算法中的队列详解(1)
    目录什么是队列?构建一个队列总结什么是队列? 队列,与栈类似,是有序集合。添加操作发生在 “尾部”,移除操作只发生在 “头部&...
    99+
    2024-04-02
  • JavaScript数据结构与算法之栈详解
    目录1.认识栈2.面向过程方法源码编写栈2.1思考2.2需要实现的方法2.3源码实现,并调用类3.用面向对象的方法来源码书写3.1思考3.2需要实现的方法3.3源码及使用类4.总结1...
    99+
    2024-04-02
  • Python数据结构与算法中的栈怎么构建
    本篇内容主要讲解“Python数据结构与算法中的栈怎么构建”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python数据结构与算法中的栈怎么构建”吧!什么是栈栈有时也被称作“下推栈”。它是有序集...
    99+
    2023-06-29
  • Python数据结构与算法中的栈怎么实现
    这篇文章主要介绍“Python数据结构与算法中的栈怎么实现”,在日常操作中,相信很多人在Python数据结构与算法中的栈怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python数据结构与算法中的栈怎...
    99+
    2023-06-29
  • Python数据结构之栈详解
    目录0. 学习目标1. 栈的基本概念1.1 栈的基本概念1.2 栈抽象数据类型1.3 栈的应用场景2. 栈的实现2.1 顺序栈的实现2.1.1 栈的初始化2.2 链栈的实现2.3 栈...
    99+
    2024-04-02
  • Python数据结构与算法中的队列详解(2)
    传土豆 队列的一个典型方法是模拟需要以 FIFO 方式管理数据的真实场景。考虑这样一个游戏:传土豆。在这个游戏中,成员们围成一圈,并依次尽可能快地传递一个土豆。在某个时刻,大家停止传...
    99+
    2024-04-02
  • 详解Python数据结构与算法中的顺序表
    目录0. 学习目标1. 线性表的顺序存储结构1.1 顺序表基本概念1.2 顺序表的优缺点1.3 动态顺序表2. 顺序表的实现2.1 顺序表的初始化2.2 获取顺序表长度2.3 读取指...
    99+
    2024-04-02
  • JS数据结构与算法中的队列结构详解
    目录队列结构一.认识队列二.队列的应用三.队列类的创建四.队列的常见操作五.击鼓传花六.优先级队列七.优先级队列的实现队列结构 一.认识队列 受限的线性结构:我们已经学习了一种受限的...
    99+
    2022-11-13
    JS数据结构与算法 JS队列结构
  • Python数据结构与算法之算法分析详解
    目录0. 学习目标1. 算法的设计要求1.1 算法评价的标准1.2 算法选择的原则2. 算法效率分析2.1 大O表示法2.2 常见算法复杂度2.3 复杂度对比3. 算法的存储空间需求...
    99+
    2024-04-02
  • 详解python数据结构之栈stack
    前言 栈(Stack)是一种运算受限的线性表。 按照先进后出(FILO,First In Last Out)的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶。栈只能在一端进行插入和删除操作。 文章内容包含: ...
    99+
    2022-06-02
    python 栈stack python数据结构
  • Python数据结构与算法之跳表详解
    目录0. 学习目标1. 跳表的基本概念1.1 跳表介绍1.2 跳表的性能1.3 跳表与普通链表的异同2. 跳表的实现2.1 跳表结点类2.2 跳表的初始化2.3 获取跳表长度2.4 ...
    99+
    2024-04-02
  • Python的数据结构与算法的队列详解(3)
    目录模拟打印机任务队列过程主要模拟步骤:​构建队列程序模拟打印程序模拟打印过程(有注释)总结模拟打印机任务队列过程 计算机科学中也有众多的队列例子。比如计算机实验室有10台计算机,它...
    99+
    2024-04-02
  • Python数据结构与算法的双端队列详解
    目录什么是双端队列​​用Python实现双端队列运用双端队列构建回文检测器总结什么是双端队列​ 双端队列是与队列类似的有序集合。它有一前、一后两端,元素在其中保持自己的位置。与队列不...
    99+
    2024-04-02
  • java数据结构之栈的详解
    目录一、栈1.栈的应用1.1括号匹配1.2后缀表达式1.3用栈实现队列1.4最小栈1.5栈的压入和弹出序列总结一、栈 栈的特性就是先进后出,常用方法是入栈(push()),出栈(po...
    99+
    2024-04-02
  • python数据结构与算法(3)
    Python内置类型性能分析 timeit模块timeit模块可以⽤来测试⼀⼩段Python代码的执⾏速度。class timeit.Timer(stmt='pass', setup='pass', ...
    99+
    2023-01-31
    数据结构 算法 python
  • Python数据结构-----栈1.0(栈的介绍与操作)
    目录 前言: 栈的介绍 Python栈的操作 1.创建栈 2.判断栈是否为满  3.判断栈是否为空  4.压栈 5.出栈 6.展示栈数据 7.获取到栈顶的数据 8.获取到栈的数据总数 第三方模块实现栈 下载模块: 导入模块:  使用示例: ...
    99+
    2023-10-18
    数据结构 链表 java python 高级编程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作