数据结构(一)

目录

一、链表与邻接表

数组模拟单链表

数组模拟双链表

二、栈与队列

数组模拟栈:

数组模拟队列:

三、kmp


一、链表与邻接表

数组模拟单链表

单链表的作用:作用主要用来存储存储图与树

#include
using namespace std;

const int N = 100010;

//head表示头结点的下标
//e[i]表示节点i的值
//ne[i]表示i的next指针是多少
//idx存储当前已经用到了哪个点
int head,e[N],ne[N],idx;

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

//将x插到头结点
void add_to_head(int x)
{
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx++;
}

//将x插到下标k的后面
void add(int k,int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx ++;
}

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

数组模拟双链表

双链表的作用:问题优化

#include
using namespace std;

const int N = 100010;

int m;
int e[N],l[N],r[N],idx;


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

//在k的右边插入一个数
void add(int k ,int x)
{
    e[idx] = x;
    r[idx] = r[k];
    l[idx] = k;
    l[r[k]] = idx;
    r[k] = idx;
}

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

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


二、栈与队列

数组模拟栈:

栈:先进后出

#include
using namespace std;

const int N = 100010;

//tt表示栈顶的下标
int stk[N],tt;

//插入
stk[++tt] = x;

//弹出
tt --;

//判断栈是否为空
if (tt>0)
{
    not empty;
}else{
    empty;
}

//栈顶
stk[tt];

数组模拟队列:

队列:先进先出

#include
using namespace std;

const int N = 100010;

//hh表示队头,tt表示队尾
//在队尾插入元素,队头弹出元素
int a[N],hh,tt = -1;

//插入
q[++tt] = x;

//弹出
hh ++;

//判断队列是否为空
if(hh<=tt) not empty;
else empty;

//取队头元素
q[hh];

三、kmp

#include
using namespace std;

const int N = 100010,M = 100010;

int n,m;
char p[N],s[M];
int ne[N];

int main()
{
    cin>>n>>p+1>>m>>s+1;

    //求next的过程
    for(int i = 2,j = 0;i<= n;i++)
    {
        while(j && p[i] != p[j+1]) j = ne[j];
        if(p[i] == p[j+1]) j++;
        ne[i] = j;
    }

    //kmp匹配过程
    for(int i = 1,j = 0;i <= m;i++)
    {
        while(j && s[i] != p[j+1]) j = ne[j];
        if(s[i] == p[j+1]) j++;
        if(j == n)
        {
            //匹配成功
            printf("%d ",i - n);
            j = ne[j];
        }
    }
    return 0;
}

你可能感兴趣的:(基础算法,数据结构)