数据结构(用数组模拟链表,队列,栈,KMP,Trie树,并查集的基本模板)

这篇博客介绍了数据结构的一些基本模板,包括用数组模拟链表、栈、队列的实现,详细讲解了KMP算法、Trie树的概念和并查集的操作。通过实例和代码模板,帮助读者理解和掌握这些数据结构和算法。
摘要由CSDN通过智能技术生成

南昌理工acm暑假集训
本周仅学习了部分数据结构模板和做了写模板题
下周将剩余数据结构(两节)学完并刷题巩固。

链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。
以数组模拟链表
优点:
好理解、不需要直接处理指针更不容易 RE
1.单链表:
链表初始化

const int N=1e5+10;
int head,ne[N],e[N],idex;//head头节点,ne[N]指向下一个节点,idex指处理到的位置 
void init()//初始化 
{
   
	idex=0;
	head=-1;
}

在链表中头节点和k节点插入p值

void add_head(int p)//将p插入头节点
{
   
    e[idex]=p;
    ne[idex]=head;
    head=idex++;
 } 
void add(int k,int p) //将p插入到下标k节点后
{
   
    e[idex]=p;
    ne[idex]=ne[k];
    ne[k]=idex++; 
} 

解释一下 就先把点k-1的next指向新插入的p点,将新插入的next指向k,让idx向下移一位;
图片转自大佬Leo_曦爵https://blog.csdn.net/wang13342322203/article/details/80834390
删除下标是k点后面的点

void remove(int k)//删除下标是k点后面的点 
{
   
    ne[k]=ne[ne[k]]; 
}

先遍历到指定节点的前一个节点,然后通过将前一个节点的next指针指向指定节点的下一个节点,达到悬空指定节点的效果,然后删除指定节点即可。
图片转自大佬Leo_曦爵https://blog.csdn.net/wang13342322203/article/details/80834390
2.双链表
双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
双链表初始化

void ini()
{
   
    //一开始左边界节点指向右边界节点,右边界节点指向左边界节点
    r[0]=1;
    l[1]=0;
    //更新节点索引
    index=2;
}

双链表的插入操作

void insert(int k,int x)//在第k个节点后插入x
{
   
    //将值赋给新节点
    value[index]=x;
    //将新节点分别指向插入位置的右节点和左节点
    r[index]=r[k];
    l[index]=k;
    //将新节点右边一节点向左指向新节点,将新节点左边一节点向右指向新节点
    l[r[k]]=index;
    r[k]=index;
    //更新节点索引
    index++;
}

双链表的删除操作

void remove(int k)
{
   
    //删除第k个节点,第k-1的右指针指向原先第k个节点的右指针指向的节点
    r[l[k]]=r[k];
    //删除第k个节点,原先第k个节点的右指针指向的节点的左指针指向原先第k个节点的左指针指向
    //的节点
    l[r[k]]=l[k];
}

1、栈(Stack)是一种线性存储结构,它具有如下特点:
(1)栈中的数据元素遵守“先进后出"(First In Last Out)的原则,简称FILO结构。 (后进先出的叫法,也是可以的)
(2)限定只能在栈顶进行插入和删除操作。
2、栈的相关概念:
(1)栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
(2)压栈:栈的插入操作,叫做进栈,也称压栈、入栈。
(3)弹栈:栈的删除操作,也叫做出栈。

基于数组的栈——以数组为底层数据结构时,通常以数组头为栈底,数组头到数组尾为栈顶的生长方向
1.模拟栈模板为

// tt表示栈顶
int stk[N], tt = 0;

// 向栈顶插入一个数
stk[ ++ tt] = x;

// 从栈顶弹出一个数
tt -- ;

// 栈顶的值
stk[tt];

// 判断栈是否为空
if (tt > 0)
{
   

}

模板题acwing模拟栈
题解:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int stk[N],tt,m,x;
int main()
{
   
    cin>>m;
    while(m--)
    {
   
        string p;
        cin>>p;
        if(p=="push")//栈顶插入元素
        {
   
            cin>>x;
            stk[++tt]=x;
        }
        else if(p==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值