数据结构 - 列表 | 栈 | 队列
主要内容:
- 1. 列表
- 2. 栈
- 3. 队列
- 4. 用栈和队列解决迷宫问题
1. 列表
列表:在其他的编程语言中叫数组,是一种基本的数据结构
1.1 数组的存储,查找,以及时间复杂度
数组中的元素是存储在一块连续的内存中,而且必须 给定要存储的数据类型以及存储的长度,因此
- 存储类型: 在创建时候必须声明存储的是那种的数据类型,这样数组中的元素的存储大小相同,加上是连续的存储方式,就可以依次进行查找
- 长度限制:声明长度,不能进行append操作,
1.2 python中的列表
1.2.1 python 中的列表如何存储
注: 突破数组的两个限制 存储类型 | append等操作
(1)实现变长(可以append以及pop) 动态扩张和动态收缩
反之当执行pop操作时,会将剩余的元素,申请一块更小的内存,存储数据,原来开辟的内存,python会进行垃圾回收
(2) 如何实现存储不同类型的元素
lst = [3,3.15,'alex']
- 当修改值的时候,只是新开辟一块内存存储新的值,初始的列表内存修改新的地址,
- 此时没有引用的内存会被python回收 (引用计数的回收机制)
1.3 python 列表操作的时间复杂度
- 存储过程虽然存在赋值的操作,但是时间复杂度为O(1) 摊还分析法(均摊)
- 另外pop不加内容的删除是O(1) ,给定内容的删除是O(n),存在位置的改变
- 赋值,修改等操作的时间复杂度为O(1)
2. 栈
2.1 栈的相关概述
- 栈的定义: 栈(Stack) 是一个数据集合,可以理解为只能在一端进行插入或删除操作
- 栈的特点:后进先出(last-in,first-out) > FIFO
- 栈的相关概念: 栈顶,栈底
- 栈的基本操作:进栈 (压栈),push,出栈,(pop),取栈顶(gettop)
注; 关于概念的面试问题
三个数的进展序列是ABC,下面哪些选项不可能是出栈序列
- CBA ,ABC,ACB,BAC,BCA,CAB (CAB不可能)
五个数的时候:ABCDE 进展序列
- ACBDE AEDCB ADBCE ABDCE
规律 三个元素 123进栈,出栈不可能是312
2.2 python实现栈
不需要自己定义,使用列表结构就可以
- 进栈函数 :append
- 出栈函数: pop
- 查看栈顶函数:li[-1]
栈的应用: 括号匹配问题: 给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹配
def brace_match(s): stack = [] d = {'(':')','[':']','{':'}'} for ch in s: if ch in {'(','[','{'}: stack.append(ch) elif ch in {')', ']', '}'}: if len(stack) == 0: return False elif d[stack[-1]] == ch: stack.pop() else: return False else: pass if len(stack) > 0: return False else: return True
2.3 队列
2.3.1 队列的概述:
- 队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
- 进行插入的一端称为队尾(rear),插入动作称为进队或入队
- 进行删除的一端称为队头(front),删除动作称为出队
- 队列的性质:先进先出(First-in, First-out)
双向队列:队列的两端都允许进行进队和出队操作
2.3.2 队列的实现原理 --> 环形队列
环形队列:当队尾指针front == Maxsize + 1时,再前进一个位置就自动到0。
实现方式:求余数运算
- 队首指针前进1:front = (front + 1) % MaxSize
- 队尾指针前进1:rear = (rear + 1) % MaxSize
- 队空条件:rear == front
- 队满条件:(rear + 1) % MaxSize == front
2.3.3 队列的内置模块
- 使用方法:from collections import deque
- 创建队列:queue = deque(li)
- 进队:append()
- 出队:popleft()
- 双向队列队首进队:appendleft
- 双向队列队尾进队:pop
from collections import deque q = deque() q.append(1) q.append(2) q.append(3) print(q.popleft())
问题1 : 如何读取一个文件的后五行?
print(list(deque(open('abc.txt', 'r', encoding='utf-8'), 5))) # q = deque([1,2,3,4,5], 3) # print(list(q)) #[3, 4, 5]
问题2:如何用两个栈实现一个队列
#进队: 进栈1; 出队:出栈2;如果栈2空,就将栈1一次出栈并进到栈2,在从栈2出栈一次 class Queue: def __init__(self): self.stack1 =[] self.stack2 =[] def push(self,val): self.stack1.append(val) def pop(self): if len(self.stack2) > 0: return self.stack2.pop() elif len(self.stack1) > 0: while len(self.stack1) > 0: self.stack2.append(self.stack1.pop()) return self.stack2.pop() else: raise ValueError('empty queue')
4. 用栈和队列解决迷宫问题