>0️⃣python数据结构与算法学习路线 >学习内容:
>- 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等...
>- 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等...
目录
堆、栈、队列基础知识
练习:
题目
输入输出
解题思路
算法实现
堆、栈、队列基础知识
栈(堆栈)(Stack) :先进后出
队列(Queue): 先进先出
堆(Heap):二叉树(优先队列首选数据结构)
堆:
什么是堆?又该怎么理解呢?
①堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
·堆中某个节点的值总是不大于或不小于其父节点的值;
·堆总是一棵完全二叉树。
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。
②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。
③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。
④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。
栈:
什么是栈?又该怎么理解呢?
①栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)
③栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域 具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。
python栈常用操作
接口 | 描述 |
push() | 入栈 |
pop() | 出栈 |
isEmpty() | 判断是否为空栈 |
length() | 获取栈的长度 |
getTop() | 取栈顶的元素,元素不出栈 |
堆、栈区别总结:
1.堆栈空间分配
①栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
②堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2.堆栈缓存方式
①栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
②堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这 些对象的速度要相对来得低一些。
3.堆栈数据结构区别
①堆(数据结构):堆可以被看成是一棵树,如:堆排序。
②栈(数据结构):一种先进后出的数据结构。
队列:
先进先出,使用引入三方库
三方库方法:
q = queue.Queue()
q.qsize() # 返回当前队列包含的消息数量
q.empty() # 如果队列为空返回True 反之False
q.full() # 如果队列满了,返回True 反之False
q.get() # 获取队列,timeout等待时间 get(self, block=True,timeout=None) block表示是否等待 timeout表示等待多久
q.put(item) # 写入队列 put(self, item, block=True,timeout=None) block表示是否等待 timeout表示等待多久
q.get_nowait() # 相当于q.get(False) 获取不等待
q.put_nowait() # 相当于 q.put(item,False) 写入不等待
q.task_done() # 在完成一项工作之后,使用这个方法可以向队列发送一个信号,表示该任务执行完毕
q.join() # 等待队列中所有任务(数据)执行完毕之后再往下执行,否则一直等待,join是判断的依据。不单单指的是队列中没有数据,数据get出去之后,要使用task_done向队列发送一个信号,表示该任务执行完毕
队列分类:
1、FIFO先入先出队列(Queue)
2、LIFO后入先出队列(LifoQueue)
3、优先级队列(PriorityQueue)
参考文章:
C语言中堆、栈、队列
“堆”,"栈","堆栈","队列"的区别
练习:
题目
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
输入输出
输入: "([)]"
输出: false
解题思路
算法实现
class Solution:
def isValid(self, s: str) -> bool:
l = len(s)
dic = {'}':'{',']':'[',')':'('}# 定义字典
stack = []# 定义list
if l % 2 == 1:
return False # 不对称直接报错
for i in s:
if stack and i in dic:
# stack有会返回true,i in dic判断键值是否在里面
if stack[-1] == dic[i]:
stack.pop() # 删除最后一个元素
else:
return False
else:
stack.append(i)
return not stack # 不能直接返回True,输入((这种会error
哈希算法