栈
特点:
元素遵循先进后出的原则tt
存储栈顶元素下标
前置数组
1 | int stk[N]; // 栈 |
基本操作
1 | stk[++ tt] = x; // 插入,从 1 开始存储 |
单调栈
分为单调递增栈和单调递减栈,栈中元素具有单调性
栈中的元素是单调递增或单调递减的
对于栈中的 $a_x \geqslant a_y$, $a_x$ 永远不会被作为答案输出,那么就在队列中删除 $a_x$ 以达到优化时间复杂度的目标
基本应用:求每一个数 左侧 / 右侧 离它最近且比他小的数,能将 $O(n^2)$ 的问题优化为 $O(n)$
1 | int n; |
队列
- 元素前进先出,在队尾插入元素,在队头弹出元素
前置数组
1 | int q[N]; // 队列 |
基本操作
1 | q[++ tt] = x; // 插入 |
循环队列
节省空间复杂度
单调队列 / 滑动窗口
能够将 $O(n^2)$ 的时间复杂度优化成 $O(n)$
1 | int nums[N], q[N]; |