zoukankan      html  css  js  c++  java
  • python之栈

      1.1、何谓栈

      栈有时也被称作“下堆栈”。它是有序集合,添加操作和移除操作总发生在同一端,即“顶端”,另一端则被称为“低端”。

      栈中的元素离低端越近,代表其在栈中的时间越长,因此栈的低端具有非常重要的意义。最新添加的元素将被最新移除。这种原则被称作LIFO(last-in first-out),即后进先出。它提供了一种基本在集合中的时间来排序的方式。最近添加的元素靠近顶端,旧元素则靠近低端。

      1.2、栈抽象数据类型

      栈抽象数据类型由下面的结构和操作定义。如前所述,栈是元素的有序集合,添加操作与移除操作都发生在其顶端。栈的操作顺序是LIFO,它支持以下是操作。  

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

      1.3、用python实现栈

      明确定义栈抽象数据类型之后,我们开始用python量将其实现。如前文所述,抽象数据类型的实现被常称作为数据结构。

      和其他面向对象编程语言一样,每当需要在python中实现像栈这样的抽象数据类型时,就可以创建新类。栈的操作通过方法实现。更近异步地说,因为栈是元素的集合,所以完全可以利用python提供的强大、简单的原生集合来实现。这里,我们将使用列表。

      python列表是有序集合,它提供了一整套方法。举例来说,对于列表[2,5,3,6,7,4],只需要烤炉将它的哪一边视为栈的顶端。一旦确定了顶端,所有操作就可以利用append和pop等列表方法来实现。

      假设列表的尾部是栈的顶端。当栈增长时(即进行push操作),新的元素会被添加到列表的尾部。pop操作同样修改这一端。代码如下

    class Stack:
        def __init__(self):
            self.items = []
    
        def isEmpty(self):
            return self.items == []
    
        def push(self, item):
            self.items.append(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)

      1.4、匹配括号

      符号匹配是许多编程语言中常见的问题,括号匹配问题只是一个特例。匹配符号是指正确地匹配和嵌套左右对应的符号。例如,在python中,方括号[和]用于列表;花括号{和}用于字典;括号(和)用于元组和算术表达式。只保证左右符号匹配,就可以混用这些符号。每一个左符号都有一个右符号与之对应,而且两个符号的类型也是一致的。

      

    from pythonds.basic import Stack
    
    def parChecker(symbolString):
        s = Stack()
        balanced = True
        index = 0
        while index < len(symbolString) and balanced:
            symbol = symbolString[index]
            if symbol in "([{":
                s.push(symbol)
            else:
                if s.isEmpty():
                    balanced = False
                else:
                    top = s.pop()
                    if not matches(top,symbol):
                        balanced = False
    
            index = index + 1
    
        if balanced and s.isEmpty():
            return True
        else:
            return False
    
    def matches(open,close):
        opens = "([{"
        closers = ")]}"
    
        return opens.index(open) == closers.index(close)
    
    symbolString = "{([()])}"
    print(parChecker(symbolString))
  • 相关阅读:
    BZOJ3779: 重组病毒
    BZOJ3112 [ZJOI2013]防守战线
    BZOJ4011 [HNOI2015]落忆枫音
    BZOJ2726 [SDOI2012]任务安排
    BZOJ1492 [NOI2007]货币兑换
    BZOJ1597 [USACO2008]土地购买
    BZOJ3611 [HEOI2014]大工程
    BZOJ3991 [SDOI2015]寻宝游戏
    BZOJ3675 [APIO2014]序列分割
    BZOJ1010 [HNOI2008]玩具装箱
  • 原文地址:https://www.cnblogs.com/mtfan01/p/15248091.html
Copyright © 2011-2022 走看看