链表/栈/队列/KMP
链表
- 用数组模拟,不同于结构体加指针
- 调用new关键字开上万级别的节点非常慢,基本会超时
单链表
- 来构造邻接表
- 用于存图与树
基本结构:
- head 表示头结点的下标
- e[i] 表示节点i的值
- ne[i] 表示节点i的下一个节点的下标
- idx 存储当前已经用到了哪个节点,表示新节点
基本操作:
- 向链表头插入一个节点
- 在节点k后面插入一个节点
- 删除节点k后面的一个节点
模板:
int head;//头指针,指向头结点
int e[N];//e[i]表示节点i的值
int ne[N],//en[i]表示节点i的下一个节点
int idx;//存储新节点的下标 //初始化
void init(){
head = 0; //0代表空节点
idx = 1;//第一个插入的节点的下标为1
} //头插法
void add_to_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 del(int k){
ne[k] = ne[ne[k]];
} //头删法,删除头结点
void del_the_head(){
head = ne[head];
} //遍历输出所有节点
for(int i = head; i; i = ne[i]) cout << e[i];
双链表
- 用于优化某些问题
基本结构:
- l[i] 存储下标为i的节点的右边的节点
- r[i] 存储下标为i的节点的左边的节点
- e[i] 存储下标为i的节点的值
- idx 存储新节点的下标
- 默认0表示空的头结点,1 表示空的尾节点,所有节点在0与1之间插入
模板:
const int N = 1e5 + 10;
int l[N], r[N], e[N], idx; //初始化
void init(){
//0表示空头节点,1表示空尾节点
r[0] = 1;
l[1] = 0;
idx = 2; //1,0已经被使用,初始化为2,表示第一个插入的节点的下标为2
} //在下标为k的节点后面插入节点
void add(int k, int x){
e[idx] = x; //赋值
l[idx] = k; //连接左
r[idx] = r[k]; //连接右
l[r[idx]] = idx; //转移连接
r[l[idx]] = idx; //转移连接
idx ++ ; //更新下标
} //删除下标为k的节点
void del(int k){
r[l[k]] = r[k];
l[r[k]] = l[k];
} //遍历输出节点,注意起点与终点
for(int i = r[0]; i != 1; i = r[i]) cout << e[i]; //以下是统一插入个数与下标的代码
//初始化
void init(){
//0表示空头结点,N - 1表示空尾节点
r[0] = N - 1;
l[N - 1] = 0;
idx = 1; //0,N - 1被使用,下标从1开始,表示第一个插入的节点下标就是1
}
//add函数不变
//遍历输出,注意起点和终点
for(int i = r[0]; i != N - 1; i = r[i]) cout << e[i];
邻接表
- 一堆单链表,单链表数组
栈
- 先进后出
模板:
int stk[N], tt;//声明栈和栈顶下标
stk[ ++ tt] = x; //x入栈
tt --; //出栈
stk[tt]; //取栈顶元素
if(tt > 0) not empty //判断是否为空
else empty
单调栈:
- 应用:在一段序列中求距离某数最近的最大值/最小值
队列
- 先进先出
模板:
int q[N], hh, tt = -1; //声明队列,队首下标,队尾下标
q[ ++ tt] = x; //入队只能从队尾
hh --; //出队只能从队首
q[hh];//取队首
q[tt];//取队尾
if(hh <= tt)not empty //判断是否为空
else empty
单调队列(单调双端队列):
- 引用:求固定大小的滑动窗口的最大值/最小值
KMP
- 模式串匹配算法
模板:
int s[N], p[M];//主串和模式串,下标从1开始 //求next数组
void get_next(){
for(int i = 2, j = 0; i <= m; ++ i){
while(j && p[i] != p[j + 1]) j = ne[j];//j可以回跳并且匹配不成功时, j回跳
if(p[i] == p[j + 1]) j ++ ; //匹配成功
ne[i] = j; //存i可以回跳的位置
}
} //KMP
for(int i = 1, j = 0; i <= n; ++ i){
while(j && s[i] != p[j + 1]) j = ne[j]; //同上
if(s[i] == p[j + 1]) j ++ ;
if(j == n){ //当j等于模式串的长度时匹配成功
j = ne[j]; //继续进行下一次匹配
cout << i - n << endl; //输出匹配的起点下标
}
}
//j = ne[j] ,j往前跳,相当于字串往后移
链表/栈/队列/KMP的更多相关文章
- java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue
LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...
- java 集合 Connection 栈 队列 及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- Java 容器之 Connection栈队列及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- java面向对象的栈 队列 优先级队列的比较
栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一 ...
- 栈 队列 hash表 堆 算法模板和相关题目
什么是栈(Stack)? 栈(stack)是一种采用后进先出(LIFO,last in first out)策略的抽象数据结构.比如物流装车,后装的货物先卸,先转的货物后卸.栈在数据结构中的地位很重要 ...
- 栈&队列&并查集&哈希表(julyedu网课整理)
date: 2018-11-25 08:31:30 updated: 2018-11-25 08:31:30 栈&队列&并查集&哈希表(julyedu网课整理) 栈和队列 1. ...
- Java数据结构——用双端链表实现队列
//================================================= // File Name : LinkQueue_demo //---------------- ...
- C语言 复杂的栈(链表栈)
//复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...
- 教你如何使用Java手写一个基于链表的队列
在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...
- Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现
栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...
随机推荐
- 2023-03-10:YUV420P像素数据编码为JPEG图片,请用go语言实现。
2023-03-10:YUV420P像素数据编码为JPEG图片,请用go语言实现. 答案2023-03-10: 方法一.使用 github.com/moonfdd/ffmpeg-go 库,基于雷霄骅的 ...
- 2022-09-10:以下go语言代码输出什么?A:编译错误;B:49.0;C:49。 package main import ( “fmt“ ) func main() { ch
2022-09-10:以下go语言代码输出什么?A:编译错误:B:49.0:C:49. package main import ( "fmt" ) func main() { ch ...
- 2022-07-25:xiu是用rust语言编写的流媒体服务器软件项目。k8s安装xiu,drone文件如何写?
2022-07-25:xiu是用rust语言编写的流媒体服务器软件项目.k8s安装xiu,drone文件如何写? 答案2022-07-25: 云原生环境不可能完全一样,只能做参考. 我采用的是dron ...
- 2020-12-08:TIME_WAIT的等待时间为什么是2MSL?
福哥答案2020-12-08:[答案来自此链接:](http://bbs.xiangxueketang.cn/question/646)这里假设主动关闭方为A,被动关闭方为B,TIME_WAIT状态是 ...
- vue对vue-giant-tree进行节点操作
vue 项目中使用到了vue-giant-tree这个使用ztree封装的树形插件,在对其节点进行操作时遇到了无法向传统的jquery那样获取到ztreeObj:而导致了无法控制节点dom:浪费了许多 ...
- django中有关登陆验证的LoginRequiredMixin类
通常情况判断一个用户是否登陆可以使用 request.user.is_is_authenticate(),就可以完成,返回结果TRUE或者FALSE class UserCenterInfoView( ...
- postgresql 安装和配置
### 安装过程 \1. 下载Postgresql源码包: \# wget http://ftp.postgresql.org/pub/source/v9.4.3/postgresql-9.4.3.t ...
- .Net NPOI Excel 导出
NPOI 导出 Excel 最终效果图 环境:Revit,WPF,NPOI 2.5.6,.Net Framework 4.7.2 一.引用 NPOI 右击项目引用,选择 "管理NuGet程序 ...
- JSON第二
HTML DOM 节点在 HTML DOM 中,所有事物都是节点.DOM 是被视为节点树的 HTML. TML 文档中的所有内容都是节点:整个文档是一个文档节点每个 HTML 元素是元素节点HTML ...
- docker desktop 与 wmware tv-x
开启WSL2,获得docker desktop的最佳性能 windows默认拥有WSL1 PS C:\Users\supermao> wsl --list --verbose NAME STAT ...