队列 & 栈 2022.10.11晚

四、队列 & 栈

背景:在数组中,可以通过索引访问随机元素 ,但是某些情况下可能要限制处理的顺序

大致了解:

  1. FIFO和LIFO处理顺序的原理
  2. 实现两个数据结构
  3. 熟悉内置的队列和栈结构
  4. 基本的队列问题BFS
  5. 理解在使用DFS和其他递归算法解决问题时,系统栈是如何发挥作用的

(一)队列:先入先出FIFO的数据结构

insert = enqueue 添加到队列末尾

delete = dequeue 只能移除第一个元素

1、实现 = 动态数组 + 指向队列头部的索引

缺点:存储空间的浪费

2、循环队列

优点:使用固定的数组SIZE和两个指针表示起始位置和结束位置,重用上面实现方法的被浪费的存储空间

definition:循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

用链表去做实现队列:

class MyCircularQueue:
    def __init__(self, k: int):
        self.head = self.tail = None
        self.capacity = k
        self.size = 0

    def enQueue(self, value: int) -> bool:
        if self.isFull():
            return False
        node = ListNode(value)
        if self.head is None:
            self.head = node
            self.tail = node
        else:
            self.tail.next = node
            self.tail = node
        self.size += 1
        return True

    def deQueue(self) -> bool:
        if self.isEmpty():
            return False
        self.head = self.head.next
        self.size -= 1
        return True

    def Front(self) -> int:
        return -1 if self.isEmpty() else self.head.val

    def Rear(self) -> int:
        return -1 if self.isEmpty() else self.tail.val

    def isEmpty(self) -> bool:
        return self.size == 0

    def isFull(self) -> bool:
        return self.size == self.capacity
3、用法

大多数流行语言都提供内置的队列库,因此无需重新发明轮子。

Python内置队列库函数 collection.deque

(二)队列和广度优先搜索BFS

1、队列和BFS

BFS一个常见应用是找出从根结点到目标结点的最短路径

结点的处理顺序与它们添加到队列的顺序是完全相同的顺序,即先进先出FIFO。这就是我们在 BFS 中使用队列的原因

2、广度优先搜索 - 模板

(三)栈:后入先出LIFO的数据结构

  1. 理解LIFO和栈的定义
  2. 用动态数组实现
  3. 熟悉内置栈结构
  4. 能够使用栈解决问题
1、后入先出的数据结构

push 入栈,末尾添加新元素

pop 退栈,始终删除队列中相对于它的最后一个元素

栈的实现比队列简单,仅需用到动态数组即可

2、最小栈

(四)栈和深度优先搜索

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值