0
点赞
收藏
分享

微信扫一扫

【Leetcode】栈-20


>​​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

解题思路

【Leetcode】栈-20_堆栈

算法实现 

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

​​哈希算法​​

举报

相关推荐

0 条评论