栈
- 特点
- 栈的最大特点就是后进先出(LIFO)。对于栈中的数据来说,所有操作都是在栈的顶部完成的,只可以查看栈顶部的元素,只能够向栈的顶部压⼊数据,也只能从栈的顶部弹出数据。
- 栈顶元素反映了在嵌套的层次关系中,最近的需要匹配的元素。
- 实现
- 利用一个单链表来实现栈的数据结构。而且,因为我们都只针对栈顶元素进行操作,所以借用单链表的头就能让所有栈的操作在 O(1) 的时间内完成。
- 应用场景
- 在解决某个问题的时候,只要求关心最近一次的操作,并且在操作完成了之后,需要向前查找到更前一次的操作。
- 注意
- 如果打算用一个数组外加一个指针来实现相似的效果,那么,一旦数组的长度发生了改变,哪怕只是在最后添加一个新的元素,时间复杂度都不再是 O(1),而且,空间复杂度也得不到优化。
- 栈是许多 LeetCode 中等难度偏上的题目里面经常需要用到的数据结构,掌握好它是十分必要的。
- 求解算术表达式的结果
- 栈经典例题
- 递归和栈的关系
- LeetCode 第 144 题:二叉树的前序遍历
- LeetCode 第 94 题:二叉树的中序遍历
- LeetCode 第 145 题:二叉树的后序遍历
- LeetCode 第 341 题:扁平化嵌套列表迭代器
队列(Queue)
- 特点
- 和栈不同,队列的最大特点是先进先出(FIFO),就好像按顺序排队一样。对于队列的数据来说,我们只允许在队尾查看和添加数据,在队头查看和删除数据。
- 实现
- 可以借助双链表来实现队列。双链表的头指针允许在队头查看和删除数据,而双链表的尾指针允许我们在队尾查看和添加数据。
- 应用场景
- 队列经典例题
- LeetCode 第 102 题:二叉树的层序遍历
- LeetCode 第 107 题:二叉树的层次遍历 II
- LeetCode 第 103 题:二叉树的锯齿形层次遍历
- LeetCode 第 199 题:二叉树的右视图
- LeetCode 第 126 题:单词接龙 II
优先队列
- 特点
- 能保证每次取出的元素都是队列中优先级别最高的。优先级别可以是自定义的,例如,数据的数值越大,优先级越高;或者数据的数值越小,优先级越高。优先级别甚至可以通过各种复杂的计算得到。
- 优先队列的底层实现是堆。
- 应用场景
- 从一堆杂乱无章的数据当中按照一定的顺序(或者优先级)逐步地筛选出部分乃至全部的数据。
- 经典例题
双端队列(Deque)
- 特点
- 双端队列和普通队列最大的不同在于,它允许我们在队列的头尾两端都能在 O(1) 的时间内进行数据的查看、添加和删除
- 实现
- 与队列相似,我们可以利用一个双链表实现双端队列
- 应用场景
- 双端队列最常用的地方就是实现一个长度动态变化的窗口或者连续区间,而动态窗口这种数据结构在很多题目里都有运用