Acwing算法基础课 (二)数据结构 (更新ing...)

数据结构

链表与邻链表

struct Node
{
    int val;
    Node *next
}

new Node(); //非常慢

数组模拟单链表 静态链表

int head; //头节点
int e[N]; //值
int ne[N]; //next指针
int idx; //数组用到第几个点

// 初始化
void init()
{
    head = -1;
    idx = 0;
}

// 在链表头插入一个数a
void insert_head(int a)
{
    e[idx] = a;
    ne[idx] = head;
    head = idx;
    idx++ ;
}

// 将头结点删除,需要保证头结点存在
void remove()
{
    head = ne[head];
}

// 将a插入到第k个点后面
void add(int k, int a)
{
    e[idx] = a;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx ++;
}
//将下标是k的后边的点删掉
void remove(int k)
{
    ne[k] = ne[ne[k]];
}

数组模拟双链表(优化某些问题)

每一个点有两个指针

int e[N];
int l[N];
int r[N];

//初始化
void init()
{
    // 0表示左端点(head), 1表示右端点(tail)
    r[0] = 1;
    l[1] = 0;
    idx = 2;
}

//在下标是k的点的右边,插入x
void add(int k, int x)
{
    e[idx] = x;
    r[idx] = r[k]; //不能用 k + 1
    l[idx] = k;
    
    l[r[k]] = idx; //不能用 k + 1
    r[k] = idx;
    
}

//在k的左边插入x
add(l[k], x);

//删除第k个点
void remove(int k)
{
    r[l[k]] = r[k];
    l[r[k]] = l[k];
}

邻接表 存储树和图

image
image

栈与队列

栈(先进后出)

队列(先进先出)

kmp

你可能感兴趣的:(c++数据结构和算法)