数据结构[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. 此处仅是对栈的一此粗浅理解及应用。
时间: 2024-08-03 21:32:10

数据结构[Python--Stack] 的应用的相关文章

Go数据结构之Stack

Stack 一个简单确很有用的数据结构:FILO package Stack import ( "errors" "fmt" ) const ( defaultLength=100 ) type Stack struct{ top int size int element []interface {} } /** 根据给定的大小初始话stack */ func NewStackBySize(size int) *Stack{ return &Stack{si

数据结构 Python实现

参考博客:浅谈算法和数据结构: 一 栈和队列   Python数据结构--栈.队列的实现(一)    Python数据结构--栈.队列的实现(二)    Python数据结构--链表的实现 数据结构 定义:简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中.比如:列表.集合与字典等都是一种数据结构. PS:"程序=数据结构+算法" 列表:在其他编程语言中称为"数组",是一种基本的数据结构类型. 关于:列表的存储问题! 栈: 栈(Stack)是一个数据集合,

如何高效地学习数据结构——Python篇

原文链接:http://www.datastudy.cc/to/43 我们来看看如何高效地学习一门语言的数据结构,今天我们先看Python篇. 所谓数据结构,是指相互之间存在一种或多种特定关系的数据类型的集合. Python在数据分析领域中,最常用的数据结构,莫过于DataFrame了,今天我们就介绍如何高效地学习DataFrame这种数据结构. 要学习好一种东西,最好给自己找一个目标,达到了这个目标,我们就是学好了.一般,我在学习一门新的语言的数据结构的时候,一般要求自己达到以下五个要求: 第

Java数据结构漫谈-Stack

Stack(栈)是一种比较典型的数据结构,其元素满足后进先出(LIFO)的特点. Java中Stack的实现继承自Vector,所以其天然的具有了一些Vector的特点,所以栈也是线程安全的. class Stack<E> extends Vector<E> { 事实上,除了继承自Vector的那些方法之外,Stack只提供了5个方法: public E push(E item) { addElement(item); return item; } public synchroni

常用数据结构Python实现

二分查找 1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 # added by kangye, dependent on python27 4 5 def BinarySearch(l,key): 6 low=0 7 high=len(l)-1 8 i=0 9 while(low <= high): 10 i = i+1 11 mid = low + ((high-low)>>1) 12 if(l[mid] < key): 13 lo

C# 数据结构 栈 Stack

栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素和元素的逻辑关系也相同 差别在于:线性表的操作不受限制,栈和队列操作受限制(遵循一定的原则),因此栈和队列也称为受限制的线性表. 栈的定义:操作在表的尾端进行的线性表,栈顶:TOP,栈底:Bottom.栈中没有数据:空栈Empty Stack 表示方法:S=(a1,a2,a3,a4……..an)a1为栈底的元素,an为栈顶的元素.这N个数据按照先后顺序插入到栈内,找出栈内数据则相反 遵循的原则(Las

数据结构:Stack

Stack设计与实现 Stack基本概念 栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作 栈顶(Top):允许操作的一端 栈底(Bottom):不允许操作的一端 Stack的常用操作 创建栈 销毁栈 清空栈 进栈 出栈 获取栈顶元素 获取栈的大小 C语言描述=====>栈的设计与实现 人生财富库积累 #ifndef _MY_STACK_H_ #define _MY_STACK_H_ typedef void Stack; Stack* Stack_Create(); void Stack_

0.数据结构(python语言) 基本概念 算法的代价及度量!!!

先看思维导图: *思维导图有点简陋,本着循循渐进的思想,这小节的知识大多只做了解即可. *重点在于算法的代价及度量!!!查找资料务必弄清楚. 零.四个基本概念 问题:一个具体的需求 问题实例:针对问题(需求)的具体的例子 算法:解决问题的过程,是对一个计算过程的严格描述 程序:程序可以看作是采用计算装置能够处理的语言描述的算法 一.算法的5大性质 有穷性(算法描述的又穷性):算法必须用有限长的描述说清楚 能行性:算法的每一步都是可行的,也就是说,每一步都能通过执行有限次数完成 确定性:别人看了过

数据结构——Java Stack 类

定义 栈是Vector的一个子类,它实现了一个标准的后进先出的栈.堆栈只定义了默认构造函数,用来创建一个空栈. 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法. 图例 在下面图片中可以看到进栈(push)和出栈(pop)的过程.简单来说,栈只有一个入口(出口),所以先进后出(后进先出)就不难理解. 常用方法 序号 方法名 描述 1 Object push() 把项压入堆栈顶部 2 Object pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象 3 Object pee

python数据结构之栈

栈 栈(stack),有些地方称为堆栈,是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop)的运算.没有了位置概念,保证任何时候可以访问.删除的元素都是此前最后存入的那个元素,确定了一种默认的访问顺序. 由于栈数据结构只允许在一端进行操作,因而按照后进先出的原理运作. 附上完整代码: class Stack(object): def __init__(self):   #初始化 s