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))
原文地址:https://www.cnblogs.com/mtfan01/p/15248091.html