第三章 基本数据结构
3.1 线性数据结构
- 一旦某个元素被添加进来,它与前后元素的相对位置将保持不变
3.2 栈
3.3.1 什么是栈
- 添加和删除操作总发生在同一端,即顶端,另一端称为底端。
- 元素添加顺序:后进先出。
- 应用:点击返回按钮,反向浏览网页。
3.3.2 栈的相关操作
- 栈是元素的有序集合
- 栈的方法:
- Stack():创建一个空栈
- push(item):将元素item添加到栈顶
- pop():将栈顶元素移除,返回栈顶元素,并修改栈
- peek():返回栈顶元素,不修改栈
- isEmpty():判断栈是否为空
- size():判断栈中元素的个数
 

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())

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("括号不匹配")
    

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("符号匹配失败")

3.3.6 将十进制转换为二进制
- 计算原理:将一个数除以2,并使用栈来保存二进制结果的每一位。
  

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号