数据结构总结
数据结构 Data Struct
链表
单链表
应用 邻接表(存储图和树)
/* head 表示头结点的指针
e[i] 表示第 i 个结点的权值
nxt[i] 表示第 i 个结点的下一个点的指针
idx 表示当前指向结点的指针
*/
// 初始化
void init() {
head = -1; // 为空集
idx = 0;
}
// 插入头结点
void add_head(int x) {
e[idx] = x, ne[idx] = head, head = idx, idx++;
}
// 在下标为 k 的数后面插入一个数
void add(int k, int x) {
e[idx] = x, ne[idx] = ne[k], ne[k] = idx, idx++;
}
// 删除下标为 k 的结点的后面的点
void delete(int k) {
ne[k] = ne[ne[k]];
}
双链表
用途 优化
/*
e[i] 表示第 i 个结点的权值, l[i] 表示第 i 个结点的左指针, r[i] 表示第 i 个结点的右指针
*/
// 初始化
void init() {
//0是左端点, 1是右端点
r[0] = 1, l[1] = 0, idx = 2;
}
// 在结点 k 的右边插入一个数 x
void insert(int k, int x) {
e[idx] = x, l[idx] = k, r[idx] = r[k];
l[r[k]] = idx, r[k] = idx, idx++;
}
// 删除结点 k
void remove(int k) {
l[r[k]] = l[k], r[l[k]] = r[k];
}
栈
int stack[100010], top = 0;
void push(int x) {
stack[++top] = x;
}
int pop() {
return stack[top--];
}
bool empty() {
if (!top) return 1;
return 0;
}
队列
int q[100010], head = 1, tail = 0;
void push(int x) {
q[++tail] = x;
}
void pop() {
head++;
}
bool empty() {
if (head > tail) return 1;
return 0;
}
循环队列
void push(int x) {
if (tail == n + 1) tail = 1; q[tail] = x;
}
void pop() {
head++;
if (head == n + 1) head = 1;
}
bool empty() {
if (head == tail) return 1;
return 0;
}
单调栈
应用
单调递增栈: 在一个队列中针对每一个元素从它右边寻找第一个比它小的元素 在一个队列中针对每一个元素从它左边寻找第一个比它小的元素 单调递减栈: 在一个队列中针对每一个元素从它右边寻找第一个比它大的元素 在一个队列中针对每一个元素从它左边寻找第一个比它大的元素
void push(int x) {
while (top && st[top] <= x) top--;
st[++top] = x;
}
单调队列
应用
找出滑动窗口中的最大值/最小值
void push(int x) {
while (tail >= head && q[head] <= x) tail--;
q[++tail] = x;
}

数据结构
浙公网安备 33010602011771号