第三章 基本数据结构

3.1 线性数据结构

  • 一旦某个元素被添加进来,它与前后元素的相对位置将保持不变

3.2 栈

3.3.1 什么是栈

  • 添加和删除操作总发生在同一端,即顶端,另一端称为底端。
  • 元素添加顺序:后进先出。
  • 应用:点击返回按钮,反向浏览网页。

3.3.2 栈的相关操作

  • 栈是元素的有序集合
  • 栈的方法:
    • Stack():创建一个空栈
    • push(item):将元素item添加到栈顶
    • pop():将栈顶元素移除,返回栈顶元素,并修改栈
    • peek():返回栈顶元素,不修改栈
    • isEmpty():判断栈是否为空
    • size():判断栈中元素的个数

image

3.3.3 Python实现栈

  • 默认是列表的尾部为栈顶,但是也可以传参0,获取列表首位作为栈顶。
  • 将列表的头部作为栈顶的插入和删除的时间复杂度为O(n),将列表的尾部作为栈顶的插入和删除为恒定时间。

例3.1 构建栈

class Stack:
    def __init__(self):
        self.items=[]
    def isEmpty(self):
        return self.items==[]
    def pop(self):
        # return self.items.pop()#调用列表中的方法
        return self.items.pop(0) #列表的头部作为栈的顶端
    def push(self,item):
        # self.items.append(item)
        self.items.insert(0,item)#列表的头部作为栈的顶端 insert
    def peek(self):
        # return self.items[len(self.items)-1]
        return self.items[0]#列表的头部作为栈的顶端
    def size(self):
        return len(self.items)
if __name__ == '__main__':
    s=Stack()
    print(s.isEmpty())
    s.push(4)
    s.push("dog")
    s.push("cat")
    print(s.size())
    print(s.pop())
    print(s.size())
    print(s.peek())
    print(s.size())

image

3.3.4 匹配括号

  • 含义:表示每个左括号都有与之对应的一个右括号,并且括号对应正确的嵌套关系。
  • 原理:从左到右依次读取括号串,然后判断其中的括号是否匹配。
    • 由一个空栈开始,从左到右依次处理括号。
    • 如果遇到左括号,通过push操作将其压入栈
    • 如果遇到右括号,就调用pop操作弹出栈

例3.2 匹配括号

from pythonds.basic.stack import Stack
def parChecker(string):
    s=Stack()
    balanced=True
    index=0
    while index<len(string) and balanced:
        symble=string[index]
        if symble=='(':
            s.push(symble)
        else:
            if s.isEmpty()==True:
                balanced=False
            else:
                s.pop()
        index=index+1
    if balanced and s.isEmpty():
        return True
    else:
        return False

string="((()))"
if parChecker(string):
    print("括号匹配正确")
else:
    print("括号不匹配")
    
string1="((())"
if parChecker(string1):
    print("括号匹配正确")
else:
    print("括号不匹配")
    

image

3.3.5 匹配符号

  • 定义:正确地匹配和嵌套左右对应的符号
    • 方括号【】用于列表;花括号{}用于字典;括号()用于元组和算术表达式

例3.3 匹配符号

from pythonds.basic.stack import Stack\
#-------1.定义判断括号是否匹配的函数-----------
def matches(open,close):
    opens="([{"
    closes=")]}"
    return opens.index(open)==closes.index(close)#通过符号的索引位置进行判断
#-------2.判断字符串中的所有括号是否匹配-------
def parChecker(string):
    #初始化
    s=Stack()
    balanced=True
    index=0
    #当字符串存在字符且是合法的,进行循环
    while index<len(string) and balanced:
        symbol=string[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

string1="([]{})"
if parChecker(string1):
    print("符号匹配成功")
else:
    print("符号匹配失败")


string1="({[]})"
if parChecker(string1):
    print("符号匹配成功")
else:
    print("符号匹配失败")

string1="({[})"
if parChecker(string1):
    print("符号匹配成功")
else:
    print("符号匹配失败")

image

3.3.6 将十进制转换为二进制

  • 计算原理:将一个数除以2,并使用栈来保存二进制结果的每一位。
    image

image

posted @ 2023-05-28 19:47  Trouvaille_fighting  阅读(35)  评论(0)    收藏  举报