第三章 基本数据结构
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号