南昌理工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向下移一位;
删除下标是k点后面的点
void remove(int k)//删除下标是k点后面的点
{
ne[k]=ne[ne[k]];
}
先遍历到指定节点的前一个节点,然后通过将前一个节点的next指针指向指定节点的下一个节点,达到悬空指定节点的效果,然后删除指定节点即可。
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==