声明:参考自acwing
目录
1.单链表
2.双链表
3.数组栈与队列
4.单调栈
1.单链表
int head,e[N],ne[N],idx;void init(){head=-1;idx=0;
}
void add_head(int x){ //head有实值e[idx]=x,ne[idx]=head,head=idx++;
}
void add(int k,int x){ e[idx]=x,ne[idx]=ne[k],ne[k]=idx++;
}
void del(int k){ne[k]=ne[ne[k]];
}
2.双链表
int e[N],l[N],r[N],idx;void init(){r[0]=1,l[1]=0;idx=2;
}
void insert(int k,int x){e[idx]=x;r[idx]=r[k];r[k]=idx;l[r[idx]]=idx;l[idx++]=k;
}
void remove(int k){r[l[k]]=r[k];l[r[k]]=l[k];
}
3.数组栈与队列
int t;
int st[N];
st[++t]=k;
--t;
t==0;int hh,tt;
int q[N];#hh做头 tt做尾
q[tt++]=k; #尾加
++hh; #头出
tt==hh #为空
4.单调栈
#常用于找出每个数左边离它最近的比它大/小的数
int tt = 0;
for (int i = 1; i <= n; i ++ )
{while (tt && check(st[tt], i)) tt -- ;st[ ++ tt] = i;
}