简单数据结构

简单数据结构

单链表

1、用途

快速维护数据的添加与删除

2、原理

每个节点由数据与指针两部分组成,指针指向该节点后一个元素所在的位置。

头指针指向链表的第一个元素。如果有尾指针的话尾指针指向链表的最后一个元素。

利用数组模拟链表,原因是new操作太慢。

3、复杂度

插入/删除:\(O(1)\)

查询/遍历:\(O(n)\)

4、模板

初始化
const int MAXN = 1e5 + 10;
int e[MAXN], ne[MAXN], idx = 0;
ne[0] = -1;

注意:

\(0\)号节点作为头指针,里面不放值,只存放第一个元素开始的地址;

\(e[i]\)表示地址为\(i\)的元素的值,\(ne[i]\)表示地址为\(i\)的元素后一个元素的地址;

③以\(-1\)作为链表结束的标志。

添加元素
e[++idx] = x, ne[idx] = ne[0], ne[0] = idx;

注意:

①该模板在链表头添加元素。

e[++idx] = x, ne[idx] = ne[k], ne[k] = idx;

注意:

①该模板在链表指定位置后添加元素。

删除元素
ne[k] = ne[ne[k]];

注意:

①该模板在链表指定位置后删除元素。

遍历链表
for (int i = ne[0]; i != -1; i = ne[i]) cout << e[i] << ' ';

5、备注

①若需要创建多个链表则需要使用\(h\)数组记录每个链表头结点的地址。

1、用途

维护一个先进后出的序列

2、原理

利用top指针,加入元素时++top,把元素放入新开辟的空间内;删除时--top,把栈顶元素弹出。

3、复杂度

添加/删除/访问栈顶元素:\(O(1)\)

4、模板

初始化
const int MAXN = 1e5 + 10;
int st[MAXN], top = 0;
添加元素
st[++top] = x;
删除元素
--top;
访问栈顶元素
return st[top];
判断栈是否为空
if (!top) return "empty";
else return "not empty";

5、备注

①在删除元素或访问栈顶元素的时候要先判断栈是否为空。

队列

1、用途

维护一个先进先出的序列

2、原理

利用头尾指针,加入元素时++r,把元素放入新开辟的空间内;删除时++l,把队首元素弹出。

3、复杂度

添加/删除/访问队首队尾元素:\(O(1)\)

4、模板

初始化
const int MAXN = 1e5 + 10;
int que[MAXN], l = 1, r = 0;
添加元素
que[++r] = x;
删除元素
++l;
访问队首元素
return que[l];
访问队尾元素
return que[r];
判断队列是否为空
if (l > r) return "empty";
else return "not empty";

5、备注

①在删除元素或访问队首/队尾元素的时候要先判断队列是否为空。

单调栈

1、用途

维护某个元素之前/之后第一个满足某条件的数

2、原理

在栈的基础上保证栈内元素的有序性

3、复杂度

添加/删除/访问栈顶元素:\(O(1)\)

4、模板

初始化
const int MAXN = 1e5 + 10;
int st[MAXN], top = 0;

注意:

①单调栈内存放的是该元素在原数组中的下标。

添加元素
while (top && check(st[top], i)) --top;
//此时st[top]为i前第一个满足某性质元素的下标
st[++top] = i;
删除元素
--top;
访问栈顶元素
return st[top];
判断栈是否为空
if (!top) return "empty";
else return "not empty";

5、备注

①在删除元素或访问栈顶元素的时候要先判断栈是否为空。

单调队列

1、用途

维护某个长度固定的区间内满足某条件的数

2、原理

在双端队列的基础上保证队列内元素的有序性

3、复杂度

添加/删除/访问队首队尾元素:\(O(1)\)

4、模板

初始化
const int MAXN = 1e5 + 10;
int que[MAXN], l = 1, r = 0;

注意:

①单调队列内存放的是该元素在原数组中的下标。

添加元素
while (l <= r && check(que[r], i)) --r;
while (l <= r && que[l] <= i - k) ++l;
que[++r] = i;
if (i >= k) ... //此时que[l]为区间内满足某条件的数,对其进行操作
删除队首元素
++l;
删除队尾元素
--r;
访问队首元素
return que[l];
访问队尾元素
return que[r];
判断队列是否为空
if (l > r) return "empty";
else return "not empty";

5、备注

①在删除元素或访问队首/队尾元素的时候要先判断队列是否为空。

例题

牛客2020暑期多校2 F Fake Maxpooling

HDU 6759 Leading Robots

posted @ 2020-09-02 16:47  Lecxcy  阅读(118)  评论(0编辑  收藏  举报