栈
栈基础
- 栈的特性:先入后出、不提供访问元素的功能
- 栈的底层容器可以是数组和链表,默认底层容器为deque双端队列
- 栈的实现在底层容器的基础上提供一些接口:push()、pop()、empty()等
栈题目
- 用栈实现队列:用栈的功能实现队列的基本操作。
- 有效的括号:用栈实现括号匹配问题,这也是编译器在词法分析中处理各种括号的逻辑。在编写代码之前应先分析出几种不匹配的情况。
- 删除字符串中的所有相邻重复项 :两个相同字符相邻就删除,这也是游戏对对碰中如果相同的元素挨在一起就要消除的逻辑。
- 逆波兰表达式求值:了解后缀运算,模拟计算机进行算数运算的方式。
队列
队列基础
- 队列的特性:先入先出、不提供访问元素的功能
- 队列的底层容器可以是数组和链表,默认底层容器为deque双端队列
- 队列的实现底层容器的基础上提供一些接口:push()、pop()、empty()等
队列题目
- 用队列实现栈:用队列的功能实现栈的基本功能。
- 滑动窗口最大值:以deque为底层设计一个单调队列,可以把入队元素从大到小排列,可以跟随滑动窗口的移动而加入弹出元素。而且在加入元素时,只加入有可能成为滑动窗口中最大值的元素,这与单调队列的push()行为有关。
- 前K个高频元素:使用map进行频率统计,使用优先级队列(底层实现通常为堆Heap)对统计结果进行排序。
总结
- 栈与队列底层实现通常为数组或链表。
- 栈多用于解决相应元素匹配、后缀运算等问题。
- 队列多用于解决动态数据流中求最值、对元素排序等问题。
- 队列中的单调队列和优先级队列是特殊场景下解决问题的利器,要熟悉其特性,活学活用它们的某些行为,例如push()等。
- 在不同场景下选择合适的数据结构,可以使解决问题变得简单和高效。