Python实现栈

2023-11-01

Python实现栈

关于栈的介绍,请参考:https://blog.csdn.net/weixin_43790276/article/details/104033337

栈的数据存储结构可以是顺序表,也可以是链表,本篇使用 Python 来分别实现顺序栈和链栈。

一、实现顺序栈

顺序栈是使用顺序表存储数据的栈,Python 中的列表元组都属于顺序表,选用列表会更方便,所以下面使用列表来存储数据。

# coding=utf-8
class SequenceStack(object):

    def __init__(self):
        self.__members = list()

    def is_empty(self):
        return not len(self.__members)

    def show(self):
        if self.is_empty():
            print('空栈')
            return
        for member in self.__members:
            print('|' + member, end='')
        print()

    def push(self, data):
        self.__members.append(data)

    def pop(self):
        if self.is_empty():
            return
        return self.__members.pop()

    def length(self):
        return len(self.__members)

    def check(self):
        if self.is_empty():
            return
        return self.__members[len(self.__members)-1]

定义一个 SequenceStack() 类,实例化的时候会创建一个空列表,这就有了一个空的顺序栈。 Python 中的列表有很多自带的方法,所以在初始化一个顺序栈时,将存储数据的列表设置成私有属性,避免用户在类外面链式调用列表的其他方法。如果用户直接在类外面操作列表,则栈“后进先出”的规则可能会被破坏。

下面是顺序栈的各个方法实现:

is_empty(): 判断顺序栈是否为空。如果存储数据的列表长度为零(对应布尔值False),则顺序栈为空(is_empty为True),反之。

show(): 展示顺序栈中的数据,也就是将栈中所有的数据依次打印输出。对存储数据的列表遍历输出即可,为了展示得更形象一点,我在栈底(封闭的一端)打印竖线,表示不能从这一端取数据。

push(data): 压栈,也就是将数据添加到栈中。如果将列表的结尾当成栈顶,则压栈可以直接调用列表的 append(data) 方法。如果将列表的开头当做栈顶,则调用列表的 insert(0, data) 方法来实现压栈。

pop(): 出栈,也就是将数据从栈中取出,并将取出的数据返回。如果将列表的结尾当成栈顶,则出栈可以直接调用列表的 pop() 方法,pop() 方法默认就是弹出并返回列表的最后一个数据。如果将列表的开头当做栈顶,则调用列表的 pop(0) 方法时弹出第一个数据。

length(): 返回顺序栈的长度。顺序栈的长度就是存储数据的列表长度。

check(): 返回顺序栈栈顶位置的数据。在从顺序栈中取数据之前,如果要先知道栈顶位置的数据是什么,可以使用此方法。如果将列表的结尾当成栈顶,则返回列表最后一个位置的数据,如果将列表的头当成栈顶,则返回列表的第一个数据。

if __name__ == '__main__':
    ss = SequenceStack()
    print("is_empty: ", ss.is_empty())
    ss.show()

    ss.push('a')
    ss.push('b')
    ss.push('c')
    ss.push('d')
    ss.push('e')
    ss.show()
    print(ss.pop())
    ss.show()

    print("sequence stack length: ", ss.length())
    print("top member is: ", ss.check())

运行结果:

is_empty:  True
空栈
|a|b|c|d|e
e
|a|b|c|d
sequence stack length:  4
top member is:  d

二、实现链栈

链栈是使用链表存储数据的栈,链表是逻辑有序的,由一个一个的节点构成,所以要先声明一个可以创建节点的类。

class Node(object):

    def __init__(self, data):
        self.data = data
        self.next = None

下面按照单向链表的方式来实现链栈。

class LinkStack(object):
    def __init__(self):
        self.__head = None

    def is_empty(self):
        return not self.__head

    def show(self):
        if self.is_empty():
            print('空栈')
            return
        cur = self.__head
        while cur is not None:
            if cur.next is not None:
                print('|' + cur.data, end='')
            else:
                print('|' + cur.data)
            cur = cur.next

    def push(self, data):
        node = Node(data)
        if self.is_empty():
            self.__head = node
            return
        cur = self.__head
        while cur.next is not None:
            cur = cur.next
        cur.next = node

    def pop(self):
        if self.is_empty():
            return
        cur = self.__head
        prev = None
        while cur.next is not None:
            prev = cur
            cur = cur.next
        if cur == self.__head:
            self.__head = self.__head.next
            return
        prev.next = cur.next
        return cur.data

    def length(self):
        length = 0
        cur = self.__head
        while cur is not None:
            length += 1
            cur = cur.next
        return length

    def check(self):
        if self.is_empty():
            return
        cur = self.__head
        while cur.next is not None:
            cur = cur.next
        return cur.data

定义一个 LinkStack() 类,实例化的时候会创建一个空链表,这就有了一个空的链栈。

下面是链栈的各个方法实现:

is_empty(): 判断链栈是否为空。如果存储数据的链表头指向空(对应布尔值False),则链栈为空(is_empty为True),反之。

show(): 展示链栈中的数据,也就是将栈中所有的数据依次打印输出。对存储数据的链表遍历输出即可,为了展示得更形象一点,我在栈底(封闭的一端)打印竖线,表示不能从这里取数据。

push(data): 压栈,也就是将数据添加到栈中。如果将链表的结尾当成栈顶,则压栈就是在链表结尾添加节点。如果将链表的头当做栈顶,则压栈就是在链表头添加节点。

pop(): 出栈,也就是将数据从栈中取出,并返回取出的数据。如果将链表的结尾当成栈顶,则出栈就是删除并返回链表尾节点的数据。如果将链表的开头当做栈顶,则出栈就是删除并返回链表头节点的数据。

length(): 返回链栈的长度。链栈的长度就是存储数据的单向链表的长度,也就是链表中有多少个数据。

check(): 返回链栈栈顶位置的数据。在从链栈中取数据之前,如果要先知道栈顶位置的数据是什么,可以使用此方法。如果将链表的结尾当成栈顶,则返回链表尾节点的数据,如果将链表的头当成栈顶,则返回链表头节点的数据。

    ls = LinkStack()
    print("is_empty: ", ls.is_empty())
    ls.show()

    ls.push('A')
    ls.push('B')
    ls.push('C')
    ls.push('D')
    ls.push('E')
    ls.show()
    print(ls.pop())
    ls.show()

    print("link stack length: ", ls.length())
    print("top member is: ", ls.check())

运行结果:

is_empty:  True
空栈
|A|B|C|D|E
E
|A|B|C|D
link stack length:  4
top member is:  D

以上就是用 Python 实现的顺序栈及链栈。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实现栈 的相关文章

  • Java作用域与生命周期

    基本数据类型的作用域 作用域决定了在其内的变量名的可用性和生命周期 与c c 一样 作用域由花括号的位置决定 int x 5 x y都可用 int y 6 只有x可用 尽管下列代码在c c 中合法 但在Java中不能使用 c c 中将一个较
  • 栈(Stack)——(二)链式存储实现

    之前的头插法天然满足先进后出 后进先出这个特点 所以我们可以使用链表 设计时选择表头 作为栈顶指针 而不是表尾 单向链表 不含头节点 不同于线式存储 所以不需要作判满操作 链式存储实现代码如下 因为有bool变量 用了C 实现 mystac
  • JVM 内存模型

    内存划分 java虚拟机按照运行时内存使用区域划分如图 区域 是否线程共享 是否会内存溢出 程序计数器 否 不会 java虚拟机栈 否 会 本地方法栈 否 会 堆 是 会 方法区 是 会 一 程序计数器 Program Counter Re
  • 栈系列之 最小栈的实现

    算法专题导航页面 算法专题 栈 栈系列之 栈排序 栈系列之 最小栈的实现 栈系列之 用栈实现队列 栈系列之 递归实现一个栈的逆序 题目 设计一个栈 其拥有常规的入栈 出栈操作外 需要额外具备获取最小元素的功能 其他限制 获取最小元素功能的时
  • 【编程之路】面试必刷TOP101:堆、栈、队列(42-49,Python实现)

    面试必刷TOP101 堆 栈 队列 42 49 Python实现 42 用两个栈实现队列 小试牛刀 step 1 push操作就正常push到第一个栈末尾 step 2 pop操作时 优先将第一个栈的元素弹出 并依次进入第二个栈中 step
  • 算法与数据结构_栈

    栈 一 什么是栈 特点总结为先进后出 后进先出 就是 First In Last Out FILO 这就是典型的 栈 结构 从其操作特性来看 栈是一种 操作受限 的线性表 它只允许从一端进行数据的插入与移除 二 既然栈不如链表 数组灵活 为
  • 数据结构--一个数组实现两个栈

    用一个数组实现两个栈 通常我们会想到以下几种方案 1 奇偶栈 即就是将数组的偶数位置看作一个栈的存储空间 将奇数位置看作另一个栈的存储空间 2 从中间分别向两边展开 即就是将数组的中间位置看作是两个栈的栈底 压栈时栈顶指针分别向两边移动 当
  • Python二叉树的三种深度优先遍历

    Python二叉树的三种深度优先遍历 一 广度优先遍历和深度优先遍历 对二叉树进行遍历 traversal 是指依次对树中每个节点进行访问 在遍历的过程中实现需要的业务 对树的遍历方式有广度优先遍历和深度优先遍历两种方式 广度优先一般用队列
  • C++语法基础之栈和队列

    栈 头文件 lt stack gt 实例化 stack在内部默认使用std deque存储数据 但是可以指定使用vector或者list存储数据 示例 std stack
  • 【JavaScript数据结构与算法】一、栈及leetcode实战

    栈 栈是一种遵从后进先出 LIFO 原则的有序集合 新添加或待删除的元素都保存在栈的同一端 称作栈顶 另一端就叫栈底 在栈里 新元素都靠近栈顶 旧元素都接近栈底 栈数据结构 我们需要一种数据结构来保存栈里的元素 可以选择数组 数组允许我们在
  • LeetCode 20. 有效的括号

    题目链接 https leetcode cn problems valid parentheses C 代码如下 class Solution public bool isValid string s stack
  • 出栈的合法性检测

    对于一个给定的入栈顺序 可能的出栈顺序会有很多 但是肯定都要遵循栈 后进先出 的特点 那么怎么进行合法性检测呢 算法思想如下 定义变量InIndex标记入栈序列的当前位置 定义OutIndex标记出栈序列的当前位置 对InIndex和Out
  • C++中用两个栈实现一个队列

    想要利用两个栈实现一个队列 首先我们需要搞清楚栈和队列的特性 栈是后进先出 是一个压栈的过程 而队列则是先进先出的一个过程 用两个栈去实现一个队列 该怎样做 首先假如我们有一组数据 7 5 9 2 然后我们需要一个栈 stack
  • C语言实现栈(基于数组)

    栈是一种操作受限的数据结构 只允许从一段操作 而且先进后出 FILO first in last out 这里将栈的操作封装在C语言的头文件里 实现栈的代码如下 include
  • 如何将栈中的元素输出

    首先需要写一个出栈函数 得到栈顶的值 才能将其输出 bool Pop SqStack s ElemType e if s gt top 1 return false e s gt data s gt top s gt top return
  • 【C++编程基础】AOJ (C++ Programming II)—2-A-stack

    2 A stack 题目 stack Stack is a container of elements that are inserted and deleted according to LIFO Last In First Out Fo
  • CH3-栈和队列

    文章目录 3 1栈和队列的定义和特点 栈的应用 队列的应用 3 1 1栈的定义和特点 3 1 2队列的定义和特点 3 2案例引入 案例3 1 进制转换 案例3 2 括号匹配的检验 案例3 3 表达式求值 案例3 4 舞伴问题 3 3栈的表示
  • 数据结构之 栈(C语言实现)

    数据结构之 栈 C语言实现 1 栈的模型 栈 stack 是限制插入和删除只能在一个位置上进行的表 该位置是表的末端 叫做栈的顶 top 对栈的基本操作有push 进栈 和pop 出栈 前者相当于插入 后者则是删除最后插入的元素 最后插入的
  • 用栈来判断括号匹配问题

    用栈实现 输入一行符号 以 结束 判断其中的括号是否匹配 括号包括 lt gt 如果匹配 输出 right 如果不匹配 给出错误提示 包括 1 对称符号都匹配 输出 right 2 处理到某个符号时不匹配了 输出 The character
  • 栈的基本操作(创建栈,压栈,出栈,遍历栈,清空栈,判断是否为空栈)

    include

随机推荐

  • CSS3+Html5 学习笔记之css 样式加载顺序

    有时候在写CSS的过程中 某些限制总是不起作用 这就涉及了CSS样式覆盖的问题 如下 navigator height 100 width 200 position absolute left 0 border solid 2 EEE cu
  • 003 数据结构_无头单向非循环链表的详细分解——“C”

    引入 前言 本文介绍的是无头单向非循环链表 这种链表结构简单 一般不会单独用来存数据 实际中更多是作为其他数据结构的子结构 如哈希桶 图的邻接表等等 另外这种结构在笔试面试中出现很多 链表是什么 常见的链表包括 单向链表 singly li
  • IDEA Git回退到指定历史版本

    1 找到要回退的版本号 右击项目 gt Git gt Show History gt 选中要回退的版本 gt Copy Revision Number 2 打开idea的Terminal 输入命令 git reset hard 139dcf
  • Dockerfile解析

    Dockerfile是什么 Dockerfile是用来构建Docker镜像的文本文件 是由一条条构建镜像所需的指令和参数构成的脚本 概述 官网 https docs docker com engine reference builder 构
  • 【CV】第 8 章:语义分割和神经风格迁移

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 传统制造型企业数字化转型面临的问题以及解决方案介绍

    传统制造业数字化转型面临的问题 一直都在关注数字化很久了 就是迟迟不敢动手 这大概是很多企业经营者的心里话 传统制造企业遇到的问题 关键还是在于数字化基础薄弱 1 工业信息化平台与软件繁多 方向和功能也各不同 对于不同的行业类别 生产工艺
  • 为什么基类的析构函数是虚函数

    点击链接查看更多C 技巧 Effective C 考虑以下继承结构 派生类 Derived 中申请了一块内存 使用指针 i ptr 管理 并在析构的时候释放掉 class Base 基类 class Derived public Base
  • 栈溢出基本原理的简单讲解

    栈溢出基本原理的简单讲解 新手上路 大牛还请自行跳过 不足之处 欢迎批评指正 一 预备知识 缓冲区溢出简单介绍 缓冲区溢出 简单的说 缓冲区溢出就是超长的数据向小缓冲区复制 导致数据超出了小缓冲区 导致缓冲区其他的数据遭到破坏 这就是缓冲区
  • 如何记忆和使用PNP和NPN?

    常用的NPN三极管型号 C1815 baiC945 S9013 S9014 S8050 2SD880 D882 2N5401 实物怎么判断PNP还是NPN 1 用万用表来进行判断 如果是指针是万用表 黑笔是电池正极 数字表相反 将指针拨到电
  • Linux下Ptread_create崩溃问题

    今天写了一个简单的Pthread函数在Linux Ubuntu20 4中qt运行 结果一运行就崩溃 百思不得其解 代码如下 include
  • 对于STM32编译出现“The size of this image (34208 bytes)...“此类问题解决办法

    自创立博客以来 就没怎么用过 感觉很对不起CSDN这个学习氛围如此浓厚的大佬论坛 闲话少说 近期忙于工作项目 在昨晚收到通知毕设要加紧进度 这才放下手中的活 毕设做的半球系统 用的mdk开发环境 当程序写好准备编译时 出现 The code
  • matlab设计FIR滤波器

    方法1 通过fir1 函数进行设计 B fir1 N Wn 设计FIR低通滤波器 返回的滤波器参数保存在长度为N 1的数组B中 Wn为归一化截止频率 范围为0 1 截止频率用于区分过渡带和阻带 1处对应的是采样频率的一半 滤波器系数B是实的
  • Apifox接口自动化测试方法

    1 新建测试用例 2 输入名称 分组 优先级后点击确定 3 点击测试用例名称或者详情 4 添加步骤 两个方式都可以 5 选择要测试的接口后选择模式 复制 绑定 复制 复制一份数据 和原来的接口相互独立 互不影响 绑定 两边改动相护实时同步
  • 深度学习之MNIST数据集

    深度学习是以数据为驱动的技术 在使用深度学习进行科研或者工作当中 都离不开数据集 文章目录 前言 一 MNIST数据集是什么 二 使用步骤 1 下载数据集 2 完整代码 总结 前言 还有一些 如人脸数据集 地球信息的数据集 数据集来源有一些
  • docker日志设置定期清理

    docker日志设置定期清理 1 日志的查看docker logs 具体的参数 请查看help命令 docker logs help 2 清除日志文件docker日志的存储位置 var lib docker containers lt 容器
  • Redis学习笔记(一):CentOS7安装Redis4

    CentOS版本 CentOS Linux release 7 5 1804 Core Redis版本 Redis server v 4 0 9 1 安装 1 1下载 去官网找到下载地址https redis io download 右键复
  • Mysql优化5-选择合适的存储引擎

    一 如何选择存储引擎 myisam 存储 如果对事务要求不高 同时以查询新增为主的 主要考虑使用此引擎 比如bbs的发帖表 回复表 INNODB 存储 对事务要求比较高 保存的数据都是重要数据 比如订单表等等 Memory 存储 数据变化频
  • 人工智能-遗传算法

    一 简介 遗传算法 Genetic Algorithm GA 借鉴了生物学遗传进化的思想 模拟了种群进化过程中经历的繁殖 杂交 基因变异的自然选择和自然变异的过程 遗传算法是一种高效的进行全局搜索和优化的方法 能在 进化 过程中自适应获得适
  • CondaHTTPError: HTTP 000 CONNECTION FAILED for url

    该博客为 Ubuntu 相关 系列博客的第七篇 该系列博客主要对Ubuntu安装各种软件或者库进行一个记录 方便重装系统后快速恢复工作 在学习大数定理和中心极限定理时 发现几个程序 但是运行不了 anaconda没有安装matplotlib
  • Python实现栈

    Python实现栈 关于栈的介绍 请参考 https blog csdn net weixin 43790276 article details 104033337 栈的数据存储结构可以是顺序表 也可以是链表 本篇使用 Python 来分别