Loading

数据结构总结

数据结构 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;
}
posted @ 2023-09-30 09:32  Gmor_cerr  阅读(41)  评论(0)    收藏  举报