【Python算法与数据结构】二、栈

时间:2019-04-18
本文章向大家介绍【Python算法与数据结构】二、栈,主要包括【Python算法与数据结构】二、栈使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.栈的定义
栈(Stack)是一种运算受限的线性表,只能在栈顶进行插入和删除操作。
因此栈具有Last In First Out(FILO)特性。

2.栈的操作

a.Stack() 创建一个空的新栈。 它不需要参数,并返回一个空栈。
b.push(item)将一个新项添加到栈的顶部。它需要 item 做参数并不返回任何内容。
c.pop() 从栈中删除顶部项。它不需要参数并返回 item 。栈被修改。
d.peek() 从栈返回顶部项,但不会删除它。不需要参数。 不修改栈。
e.isEmpty() 测试栈是否为空。不需要参数,并返回布尔值。
f.size() 返回栈中的 item 数量。不需要参数,并返回一个整数。

注意,Stack 类的定义是从 pythonds 模块导入的。pythonds 模块包含了很多数据结构的实现。它根据以下部分构造:基本数据类型,树和图。

from pythonds.basic.stack import Stack
s = Stack()
print(s.isEmpty())
s.push(4)
s.push('dog')
print(s.peek())
s.push(True)
print(s.size())
print(s.isEmpty())
s.push(8.4)
print(s.pop())
print(s.pop())
print(s.size())

3.Python实现栈
Python 中,与任何面向对象编程语言一样,抽象数据类型(如栈)的选择的实现是创建一个新类。以下栈实现假定列表的结尾将保存栈的顶部元素。随着栈增长(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):
        self.items.pop()
    
    #返回栈顶元素
    def peek(self):
        return self.items[len(self.items)-1]
    
    #返回栈的元素数目
    def size(self):
        return len(self.items)

4.栈应用–简单的括号匹配

我们现在把注意力转向使用栈解决真正的计算机问题。你会这么写算术表达式:
(5+6)*(7+8)/(4+3)
括号匹配意味着每个开始符号具有相应的结束符号,并且括号能被正确嵌套。考虑下面正确匹配的括号字符串:

(()()()())

(((())))

(()((())()))

对比那些不匹配的括号:

((((((())

()))

(()()(()

实现此算法的 Python 代码:

from pythonds.basic.stack import Stack

def parChecker(symbolString):
    s = Stack()
    balance = True
    index = 0
    while(index < len(symbolString) and balance):
        symbol = symbolString[index]
        if(symbol == '('):
            s.push(symbol)
        else:
            if(s.isEmpty()):
                balance = False
            else:
                s.pop()
                
        index = index + 1
    
    if(balance and s.size() == 0):
        return True
    else:
        return False

5.栈应用–符号匹配
上面显示的匹配括号问题是许多编程语言都会出现的一般情况的特定情况。匹配和嵌套不同种类的开始和结束符号的情况经常发生。例如,在 Python 中,方括号 [ 和 ] 用于列表,花括号 { 和 } 用于字典。括号 ( 和 ) 用于元祖和算术表达式。只要每个符号都能保持自己的开始和结束关系,就可以混合符号。符号字符串如

{ { ( [ ] [ ] ) } ( ) }
[ [ { { ( ( ) ) } } ] ]
[ ] [ ] [ ] ( ) { }

实现此算法的 Python 代码:

from pythonds.basic import Stack

def match(symbol,sTop):
    if(symbol == ')' and sTop =='('):
        return True
    elif(symbol == ']' and sTop =='['):
        return True
    elif(symbol == '}' and sTop =='{'):
        return True
    else:
        return False
    
def parChecker(symbolString):
    s = Stack()
    index = 0
    balance = True
    while(index < len(symbolString) and balance):
        symbol = symbolString[index]
        if(symbol in '([{'):
            s.push(symbol)
        else:
            if(not s.isEmpty() and match(symbol,s.peek())):
                s.pop()
            else:
                balance = False
        index = index + 1
    
    if(s.isEmpty() and balance):
        return True
    else:
        return False

6.栈应用–十进制转换成二进制

from pythonds.basic import Stack

def divideBy2(decNumber):
    s = Stack()
    while(decNumber):
        s.push(decNumber%2)
        decNumber = decNumber//2
    
    binString = ''
    while(not s.isEmpty()):
        binString = binString + str(s.pop())
    
    return binString

欢迎关注微信公众号:516数据工作室