iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >数据结构[Python--Stack]
  • 233
分享到

数据结构[Python--Stack]

数据结构PythonStack 2023-01-31 05:01:40 233人浏览 安东尼

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

摘要

难得有些许空闲,看一下python的数据结构--Stack,现将几个典型示例进行总结!一、什么是栈     栈是一个有序集合,根据其特性可以称为"先进后出"或"后进先出", 其中添加或删除都发生在同一端,这一端被称为"栈顶",与其对应的叫"

难得有些许空闲,看一下python数据结构--Stack,现将几个典型示例进行总结

一、什么是栈

     栈是一个有序集合,根据其特性可以称为"先进后出"或"后进先出", 其中添加或删除都发生在同一端,这一端被称为"栈顶",与其对应的叫"栈底"。

    栈的底部很重要,因为其底部存储的数据是时间最长的,最近的添加项总是最先会弹出,这种排序原则有时被称为"LIFO"

二、栈

1. 栈的可用操作

  • Stack() 创建一个空的新栈。 它不需要参数,并返回一个空栈。

  • push(item)将一个新项添加到栈的顶部。它需要 item 做参数并不返回任何内容。

  • pop() 从栈中删除顶部项。它不需要参数并返回item 。栈被修改。

  • top() 从栈返回顶部项,但不会删除它。不需要参数。 不修改栈。

  • isEmpty()测试栈是否为空。不需要参数,并返回布尔值。

  • size() 返回栈中的item 数量。不需要参数,并返回一个整数。

  • clear 清空栈,没有返回值

2. 利用Python 的内置的数据结构List实现栈全部操作

class Stack():
    def __init__(self):
        self.itmes = []
    def isEmpty(self):
        return self.itmes == []
    def clear(self):
        del self.itmes[:]
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.itmes.pop()
    def top(self):
        return self.items[-1]
    def size(self):
        return len(self.itmes)

3. 栈的使用示例

3.1 进制转换

class Stack():
    def __init__(self):
        self.itmes = []
    def isEmpty(self):
        return self.itmes == []
    def clear(self):
        del self.itmes[:]
    def push(self, item):
        self.items.append(item)
    def pop(self):
        return self.itmes.pop()
    def top(self):
        return self.items[-1]
    def size(self):
        return len(self.itmes)
def divideBy2(decNumber, base):
    remstack = Stack()
    while decNumber > 0:
        rem = decNumber % base
        remstack.push(rem)
        decNumber = decNumber // base
    binString = ""
    while not remstack.empty():
        binString = binString + str(remstack.pop())
    return binString
if __name__ == '__main__':
    print(divideBy2(42, 2))

说明: 这是用List结构来实现的"栈", 同样我们可以自己写一个栈

3.2 自己写栈

class node:
    def __init__(self, value):
        self.value = value
        self.next = None
class Stack:
    def __init__(self):
        self.top = None
    def push(self, value):
        node = Node(value)
        node.next = self.top
        self.top = node
    def pop(self):
        node = self.top
        self.top = node.next
        return node.value
s = Stack()
s.push(3)
s.push('ac')
s.push('er')
s.pop()
s.push(5)

说明

  1. 上面所定义的栈,是由top指针指向一个完整的Node实例

  2. 定义一个栈,使用指针控制其读取的位置。

3.3 栈应用--前缀表达式(波兰式)

from __future__ import division
class Node():
    def __init__(self, value):
        self.value = value
        self.next = None
class StackNode():
    def __init__(self):
        self.top = None
    def push(self, value):
        node = Node(value)
        node.next = self.top
        self.top = node
    def pop(self):
        node = self.top
        self.top = node.next
        return node.value
def compute_exec(op, ov1, ov2):
    def add(ov1, ov2):
        return ov1 + ov2
    def sub(ov1, ov2):
        return ov1 - ov2
    def mul(ov1, ov2):
        return ov1 * ov2
    def div(ov1, ov2):
        return ov1 / ov2
    ops = {add: '+', sub: '-', mul: '*', div: "/"}
    for k, v in ops.items():
        if v == op:
            ret = k(ov1, ov2)
            stack1.push(ret)
            break
def perfix_reverse(string):  # reverse
    tmp = ''
    for s in string[::-1]:
        if s == "(":
            tmp += ")"
        elif s == ")":
            tmp += "("
        else:
            tmp += s
    return tmp
def infix_to_prefix(string):
    opt = ''
    string_tmp = perfix_reverse(string)
    for i in string_tmp:  #  前缀表达式
        if i.isdigit():
            opt = i + opt
        elif i != ')':
            stack1.push(i)
        elif i == ")":
            opt = stack1.pop() + opt
            stack1.pop()
    for s in opt[::-1]:
        if s.isdigit():
            stack1.push(s)
        else:
                op1 = s
                ov1 = stack1.pop()
                ov2 = stack1.pop()
                compute_exec(op1, int(ov1), int(ov2))  # compute result 
                continue
    return opt, stack1.pop()
if __name__ == '__main__':
    stack1 = StackNode()  # 操作符
    infix = ['((3+4)*2)', '((3+(4*2))-1)', '(5*(1+2))']
    for i, v in enumerate(infix):
        print infix[i], "==>", infix_to_prefix(v)

说明:

  1. 前缀表达式就是说操作符位于操作数之前

  2. 表达式从右向左依次解析。将数值压栈,遇到符号将栈顶的操作数与次位置弹出进行计算,结果再次入栈,直到表达式解析完成。

3.4 栈应用--后缀表达式(逆波兰式)

class Node():
    def __init__(self, value):
        self.value = value
        self.next = None
class StackNode():
    def __init__(self):
        self.top = None
    def push(self, value):
        node = Node(value)
        node.next = self.top
        self.top = node
    def pop(self):
        node = self.top
        self.top = node.next
        return node.value
def compute_exec(op, ov1, ov2):
    def add(ov1, ov2):
        return ov1 + ov2
    def sub(ov1, ov2):
        return ov1 - ov2
    def mul(ov1, ov2):
        return ov1 * ov2
    def div(ov1, ov2):
        return ov1 / ov2
    ops = {add: '+', sub: '-', mul: '*', div: "/"}
    for k, v in ops.items():
        if v == op:
            ret = k(ov1, ov2)
            stack1.push(ret)
            break
def postfix(expr):
    for s in expr:
        if s.isdigit():
            stack2.push(s)
        elif s != ")":
            stack1.push(s)
        elif s == ")":
            top = stack2.pop()
            snext = stack2.pop()
            stack2.push(''.join([snext, top, stack1.pop()]))
            stack1.pop()
    post_expr = stack2.pop()
    for i in post_expr:
        if i.isdigit():
            stack1.push(i)
        else:
            op = i
            top = stack1.pop()
            snext = stack1.pop()
            compute_exec(op, int(snext), int(top))
    return post_expr, stack1.pop()
if __name__ == '__main__':
    stack1 = StackNode()  # 操作符
    stack2 = StackNode()  # 操作数
    exprs = ['((3+(4*2))-1)', '((3*4)+(3/2))']
    for e in exprs:
        print e, "==>", postfix(e)

说明:

  1.  后缀表达式就是说操作符位于操作数之后。

  2.  表达式从左向右依次解析。将数值压栈,遇到符号将栈顶的操作数与次位置弹出进行计算[次位操作数 栈顶操作数 操作符 ],结果再次入栈,直到表达式解析完成

  3.  计算表达式结果时同样是[次位操作数 操作符 栈顶操作数 ]


四、总结

  1. 以上示例都可以通过Http://pythontutor.com/visualize.html#mode=edit 查看程序运行的每一步

  2. 本文参考于https://www.gitbook.com/book/facert/python-data-structure-cn/details

  3. 以上后两个示例代码基于自己理解所写,可能存在bug

  4. 后两个示例的缺点是没有写表达式合法性的检查,表达式的优先级(如表达式无括号可能会导致程序异常)

  5. 此处仅是对栈的一此粗浅理解及应用。


--结束END--

本文标题: 数据结构[Python--Stack]

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

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

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 数据结构[Python--Stack]
    难得有些许空闲,看一下Python的数据结构--Stack,现将几个典型示例进行总结!一、什么是栈     栈是一个有序集合,根据其特性可以称为"先进后出"或"后进先出", 其中添加或删除都发生在同一端,这一端被称为"栈顶",与其对应的叫"...
    99+
    2023-01-31
    数据结构 Python Stack
  • Golang如何实现数据结构Stack
    本文小编为大家详细介绍“Golang如何实现数据结构Stack”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang如何实现数据结构Stack”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。介绍Stack在计...
    99+
    2023-07-06
  • C++实现stack与queue数据结构的模拟
    目录stack模拟实现queue模拟实现栈和队列都是容器适配器搞出来的,对容器进行封装,从而实现先进先出和后进先出的结构 stack模拟实现 常规实现数据结构的思路 template...
    99+
    2023-05-16
    C++ stack与queue模拟 C++ stack模拟实现 C++ queue模拟实现
  • Golang实现数据结构Stack(堆栈)的示例详解
    目录前言介绍StackStackPushPopPeekLen & Cap & ClearNewStack使用前言 始于此篇,为了学习 Golang 基础,采用了使用 ...
    99+
    2023-05-15
    Golang实现数据结构Stack Golang Stack Golang 堆栈
  • python 数据结构
    list(列表)创建list方式1  : 直接创建  theList = [1,2,3,4,5,6,7,8,9]                    ==> [1,2,3,4,5,6,7,8,9]方式2 : 使用内建方法list()...
    99+
    2023-01-31
    数据结构 python
  • python数据结构
    一:数据结构  数据结构可以认为他们是用来处理一些数据的或者说是存储数据。  对于数据结构的介绍会关系到类和对象的定义,此处对这两个定义加以描述。  何为类:说道类首先我们能够想到类型,在数据结构中类型有哪些常用的类型有int整型,floa...
    99+
    2023-01-31
    数据结构 python
  • [Python]数据结构--Bitmap
    ‘Festinatione facit vastum’ Bitmap简介 Bitmap的实现和使用 Bitmap简介 bitmap是很常用的数据结构,比如用于Bloom Filter中、用于无重复整数的排序等等。bit...
    99+
    2023-01-31
    数据结构 Python Bitmap
  • python 数据结构篇
    在众多编程语言里,数据结构与算法都可以说是至关重要的基础。但是对于python而言,因为其本身就是用C实现的,其速度和效率本身较低,因而pyhon没有像其他语言那样那么重视数据结构与算法(python最引以为傲的应该是其功能强大而丰富的各种...
    99+
    2023-09-13
    python 开发语言 数据结构
  • Python数据结构__树
    树是一种非常重要的数据结构,它是非线性结构,它不是Python内置的数据结构;树:  1.非线性结构,每个元素可以有多个前驱和后继;  2.树是n(n>=0)个元素的集合    n=0时,称为空树;    树只有一个特殊的没有前驱的元...
    99+
    2023-01-31
    数据结构 Python
  • c语言数据结构之栈和队列详解(Stack&Queue)
    目录简介栈一、栈的基本概念1、栈的定义2、栈的常见基本操作二、栈的顺序存储结构1、栈的顺序存储2、顺序栈的基本算法3、共享栈(两栈共享空间)三、栈的链式存储结构1、链栈2、链栈的基本...
    99+
    2024-04-02
  • python数据结构:数据类型
    目录1.数据是什么?2.数据类型2.1内建原子数据类型2.2 内建集合数据类型3.集合数据类型的方法3.1 列表3.2 字符串3.3 元祖3.4 集合3.5 字典1.数据是什么? 在...
    99+
    2024-04-02
  • Python数据结构列表
    目录1 序列2 列表2.1 列表函数2.2 列表排序2.3 解析列表正则小练习:匹配出以下字符串所有url, import re def find_url(sentence, ...
    99+
    2024-04-02
  • Python数据结构:集合
    集合的定义  使用大括号,并且里面必须有初始值,否则是dict字典类型 集合的特征 集合内部的元素无序,所以不能使用索引、切片等操作 集合内部的元素具有唯一性,不允许元素重复出现 集合内部的元素,只能存放int, float, s...
    99+
    2023-01-30
    数据结构 Python
  • (python)数据结构---集合
    一、描述 set翻译为集合 set是可变的、无序的、不可重复的 set的元素要求可哈西(不可变的数据类型可哈西,可变的数据类型不可哈希) set是无序的,因此不可以索引,也不可以修改 线型结构的查询时间复杂度是O(n),随着数据的增大...
    99+
    2023-01-30
    数据结构 python
  • python数据结构之 set
     在数学概念中,被意为整合元素的定义区域在python中,set最大的作用是用来去重 set常见操作:In [158]: s ={1,1,1,1,2,22,33,3,3,3} In [159]: sOut[159]: {1,2, 3, 22...
    99+
    2023-01-31
    数据结构 python set
  • Python 数据结构 tree 树
    树节点类 TreeNode 作为最简单的树节点,我们只需要3个基本属性 name: 当前节点的名字(使用str来保存) parent: 父节点对象(对根节点来说,该值为Null) child: 字节点对象们(使用dict来保存...
    99+
    2023-01-31
    数据结构 Python tree
  • Python数据结构详细
    目录1. 关于列表更多的内容1.1. 把列表当作堆栈使用1.2. 把列表当作队列使用1.3. 列表推导式1.4. 嵌套的列表推导式2. del 语句3. 元组和序列4. 集合6. 循...
    99+
    2024-04-02
  • python数据结构之quick_sor
    Quick sort , also known as partition-exchange sort, divides the data to be sorted into two separate parts by a single s...
    99+
    2023-01-30
    数据结构 python quick_sor
  • python内置数据结构
    1、列表--是一个序列,用于顺序的存储数据列表的定义与初始化In [374]: lst = list() In [375]: lst Out[375]: [] In [376]: lst = [] In [377]: lst = [1...
    99+
    2023-01-31
    数据结构 python
  • 结构化数据和非结构化数据的提取【Python篇】
    结构化数据和非结构化数据的提取【Python篇】 总结一下Pyhon提供的可以提取结构化数据以及非结构化数据的主流库。 1.常见数据的分类: 依据响应分类(附带对应的常用的解析方法~): 结构化...
    99+
    2023-09-06
    python 数据的提取 json和jsonpath模块 re和xpath模块 bs4和pyquery库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作