数据结构一
单链表
1 | // head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点 |
双链表
1 | // e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点 |
栈
1 | // tt表示栈顶 |
队列
普通队列:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// hh 表示队头,tt表示队尾
int q[N], hh = 0, tt = -1;
// 向队尾插入一个数
q[ ++ tt] = x;
// 从队头弹出一个数
hh ++ ;
// 队头的值
q[hh];
// 判断队列是否为空
if (hh <= tt)
{
}循环队列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// hh 表示队头,tt表示队尾的后一个位置
int q[N], hh = 0, tt = 0;
// 向队尾插入一个数
q[tt ++ ] = x;
if (tt == N) tt = 0;
// 从队头弹出一个数
hh ++ ;
if (hh == N) hh = 0;
// 队头的值
q[hh];
// 判断队列是否为空
if (hh != tt)
{
}
单调栈
常见模型:找出每个数左边离它最近的比它大/小的数
1 | int tt = 0; |
单调队列
常见模型:找出滑动窗口中的最大值/最小值
1 | int hh = 0, tt = -1; |
KMP
1 | // s[]是长文本,p[]是模式串,n是s的长度,m是p的长度 |
next数组的含义:对next[ j ] ,是p[ 1, j ]串中前缀和后缀相同的最大长度(部分匹配值),即 p[ 1, next[ j ] ] = p[ j - next[ j ] + 1, j ]。
对 p = “abcab”手动求next[i]
p | a | b | c | a | b |
下标 | 1 | 2 | 3 | 4 | 5 |
next[i] | 0 | 0 | 0 | 1 | 2 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Gallifrey的计算机学习日记!
评论