数据结构的分类
线性结构、树结构、图解钩(一对一,一对多,多对多)
一笔画问题
图的节点的度为奇数的节点个数为0个或者2个;其中2个时,起点、终点为一个奇点。
32位机只能寻址4g内存。
python列表的存储
列表可变长:开一个固定长度空间,不够再开一倍,开完复制再append。摊还分析(动态表)下时间复杂度O(1),因为需要开的频率越来越少。
元素类型不一样:存地址,指向对象
线性表分为:顺序表、链表
线性结构:栈
LIFO
栈底,栈顶
对列表来说,支持的栈操作是li.appenrd()和li.pop()
面试题:
进栈顺序ABC,理一下出栈顺序:ABC,ACB,BCA,BAC,CBA
后面的元素先出,那么它前面的元素后出是一定是反着的。
N个元素的合法出栈序列个数是卡特兰数。
应用:括号匹配
# 括号匹配问题 def brace_match(s): stack = [] match = {'}': '{', ']': '[', ')': '('} for chr in s: if chr in {'[', '{', '('}: stack.append(chr) elif len(stack) == 0: print('数目不匹配') return False elif match[chr] == stack[-1]: stack.pop() elif match[chr] != stack[-1]: print('{}不匹配{}'.format(chr, stack[-1])) return False if len(stack) == 0: print('匹配成功') return True else: print('数目不匹配') return False s = '{}(){}{[]()}' brace_match(s)
队列
一端(队尾)插入,列一端(对头)删除
FILO
双向队列
队列的实现:
1 append,不用pop,front 指针后移
2 环形队列,取摸操作,满了就得再开了
两个栈做一二个队列:
进队——》1号栈进栈
出队——》2号栈出栈;若为空,1号栈栈出栈进2号栈,再2号出栈(2号空了之后,2号才能进栈操作)
队列内置模块
1 from collections import deque
2 import queue