我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用Python实现数据结构之栈

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用Python实现数据结构之栈

栈是最简单的数据结构,也是最重要的数据结构。它的原则就是后进先出(LIFO),栈被使用于非常多的地方,例如浏览器中的后退按钮,文本编辑器中的撤销机制,接下来我们用Python来具体实现这个数据结构。

栈中的方法

作为一个栈(用S来表示),最基本的方法有下面几个:

  • S.push(e): 将元素e添加到S的栈顶

  • S.pop(): 从栈S中移除并返回栈顶的元素,如果此时栈是空的,那么这个操作将会报错

  • S.top(): 不移除栈顶元素,但返回栈顶元素,如果此时栈是空的,那么这个操作将会报错

  • S.is_empty(): 如果栈为空,则返回True,否则返回False

  • len(S): 返回栈中元素的数量,使用len的特殊方法实现

具体实现

Python中的list类与栈的结构很像,但是又有许多不同之处,所以我们以list为基础创建一个新的栈类,代码如下:


class Stack():
    """
    以list为基础实现的栈
    """

    def __init__(self):
        self._data = []

    def __len__(self):
        return len(self._data)

    def is_empty(self):
        return len(self._data) == 0

    def push(self, e):
        self._data.append(e)

    def pop(self):
        if self.is_empty():
            raise Empty('Stack is empty')
        return self._data.pop()

    def top(self):
        if self.is_empty():
            raise Empty('Stack is empty')
        return self._data[-1]

其中pop与top方法中对于空栈时报的异常是我们自定义的:


class Empty(Exception):

    pass

因为列表对于这种情况会产生IndexError,但这个异常与栈并不是很符合,所以我们使用了自定义的异常

简单分析

由于Python是一门动态语言,与一些其他的语言相比,栈中的元素类型可以不一样,所以栈在Python中的使用很灵活,但也有可能会因此使程序理解起来更复杂,如果想要实现这种要求严格的栈类型,可以使用基于array模块中的紧凑数组实现

我们栈中的push方法是利用列表中的append方式实现的,那么列表中的这种动态增加长度的方式我们是有必要了解一下的,先看一个例子:


import sys
data = []
for _ in range(30):
    a = len(data)
    b = sys.getsizeof(data)
    print('长度:{0:3d}; 占用字节:{1:4d}'.format(a,b))
    data.append(None)

运行结果为:

长度: 0; 占用字节: 64
长度: 1; 占用字节: 96
长度: 2; 占用字节: 96
长度: 3; 占用字节: 96
长度: 4; 占用字节: 96
长度: 5; 占用字节: 128
长度: 6; 占用字节: 128
长度: 7; 占用字节: 128
长度: 8; 占用字节: 128
长度: 9; 占用字节: 192
长度: 10; 占用字节: 192
长度: 11; 占用字节: 192
长度: 12; 占用字节: 192
长度: 13; 占用字节: 192
长度: 14; 占用字节: 192
长度: 15; 占用字节: 192
长度: 16; 占用字节: 192
长度: 17; 占用字节: 264
长度: 18; 占用字节: 264
长度: 19; 占用字节: 264
长度: 20; 占用字节: 264
长度: 21; 占用字节: 264
长度: 22; 占用字节: 264
长度: 23; 占用字节: 264
长度: 24; 占用字节: 264
长度: 25; 占用字节: 264
长度: 26; 占用字节: 344
长度: 27; 占用字节: 344
长度: 28; 占用字节: 344
长度: 29; 占用字节: 344

通过观察data列表占用字节大小的增长规律,发现在不断的添加中,data的占用的字节每次增加的是越来越大。这是由于list在底层还是基于数组实现的,它每次都会先申请一个长度,当占用的字节要超过最大范围时,再将数组的大小增加。

很明显,当不得不在底层增加数组长度的时候,这时的消耗必然比只添加数据时要大,所以在某些情况下,我们的栈的实现,可以增加一个设置固定长度,提前将所有位置初始化为None,那么在程序运行时,就会减少了再增大底层数组时的开销,这样做有时会非常有用。


参考《数据结构与算法Python语言实现》

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

用Python实现数据结构之栈

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

用Python实现数据结构之栈

栈是最简单的数据结构,也是最重要的数据结构。它的原则就是后进先出(LIFO),栈被使用于非常多的地方,例如浏览器中的后退按钮,文本编辑器中的撤销机制,接下来我们用Python来具体实现这个数据结构。栈中的方法作为一个栈(用S来表示),最基本
2023-01-30

Python 数据结构之堆栈实例代码

Python 堆栈 堆栈是一个后进先出(LIFO)的数据结构. 堆栈这个数据结构可以用于处理大部分具有后进先出的特性的程序流 . 在堆栈中, push 和 pop 是常用术语:push: 意思是把一个对象入栈.pop: 意思是把一个对象出
2022-06-04

详解python数据结构之栈stack

前言 栈(Stack)是一种运算受限的线性表。 按照先进后出(FILO,First In Last Out)的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶。栈只能在一端进行插入和删除操作。 文章内容包含: (1)栈的基本格式 (2
2022-06-02

Python数据结构之栈、队列的实现代码分享

1. 栈 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶
2022-06-04

用Python实现数据结构之树

树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结
2023-01-30

Javascript数据结构之栈和队列怎么实现

本篇内容主要讲解“Javascript数据结构之栈和队列怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript数据结构之栈和队列怎么实现”吧!栈(stack)栈是一种具有 「
2023-06-30

用Python实现数据结构之链表

链表与栈,队列不一样,它是由一个个节点构成的,每个节点存储着本身的一些信息,也存储着其他一个或多个节点的引用,可以从一个节点找到其他的节点,节点与节点之间就像是有链连在一起一样,这种数据结构就叫做链表单向链表是链表的最简单形式,链表的第一个
2023-01-30

用Python实现数据结构之队列

队列与栈的类型很相似,但它遵循的原则是先进先出(FIFO),也就是元素插入的时候只能在该数据结构的末端,而删除只能删除最前面的元素。队列同样应用广泛,例如打印机的队列或者是一个web服务器响应请求。关于队列的方法作为一个队列,同样要满足一下
2023-01-30

Python数据结构的栈实例分析

这篇文章主要介绍“Python数据结构的栈实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python数据结构的栈实例分析”文章能帮助大家解决问题。1. 栈的基本概念1.1 栈的基本概念栈 (
2023-06-29

java 数据结构之栈与队列

java 数据结构之栈与队列一:对列队列是一种先进先出的数据结构实现代码:package Queue; public class Queue { //队列类
2023-05-31

Java数据结构之栈与综合计算器的实现

这篇文章主要为大家详细介绍了Java数据结构中栈与综合计算器的实现,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
2022-11-13

Python数据结构与算法中的栈怎么实现

这篇文章主要介绍“Python数据结构与算法中的栈怎么实现”,在日常操作中,相信很多人在Python数据结构与算法中的栈怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python数据结构与算法中的栈怎
2023-06-29

Python 数据结构之队列的实现

Python 队列 Queue 队列是一种先进先出(FIFO)的数据类型, 新的元素通过 入队 的方式添加进 Queue 的末尾, 出队 就是从 Queue 的头部删除元素. 用列表来做 Queue:queue = [] #
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录