首页 > 其他分享 >数据结构

数据结构

时间:2023-01-26 19:22:18浏览次数:35  
标签:head idx int px ne ++ 数据结构

二、数据结构

1.单链表

头插法建立链表,删除一个数,在指定位置插入一个数

image-20230109114030361 image-20230109114128882
#include <iostream>
using namespace std;
const int N=100010;
int head,e[N],ne[N],idx;
//idx,存储当前已经用到了哪个点。ne【i】表示节点的next指针是多少,
//e【i】表示结点i的值,head表示头结点的下标
void init()
{
    //初始化链表
    head=-1;
    idx=0;
}
//将s插到头节点
void add_to_head(int x)
{
e[idx]=x;//先把x存下
ne[idx]=head;//红颜色指针指向head
 head=idx;//head的值指向新增值
 idx++;//结点已经被用过了移到下一个位置
 
    }
//将x点插入下标为k的后面
void add(int k,int x)
{
    e[idx]=x;
    ne[idx]=ne[k];//红颜色指针指向k
    ne[k]=idx;//k指向下一步
    idx++;
}
//单链表的删除,将k后面的删掉
void remove(int k)
{
    ne[k]=ne[ne[k]];
}
int main()
{
   int m;
   cin>>m;
   init();//初始化
   while(m--)
   {
       int k,x;
       char op;
        cin >> op;
       if(op=='H')
       {
           cin>>x;
           add_to_head(x);
       }
       else if(op=='D')
       {
           cin>>k;
           if(!k) head=ne[head];
           else remove(k-1);
       }
       else
       {
           cin>>k>>x;
           add(k-1,x);
       }
   }
   for(int i=head;i!=-1;i=ne[i]) cout<<e[i]<<' ';
   cout<<endl;
   return 0;
}

2.双链表

插入

image-20230109133309941

看至数据结构01.01

3.栈、队列

栈先进后出,队列先进先出

//********栈
int stk[N],tt;
//插入
stk[++tt]=x;
//弹出
tt--;
//判断栈是否为空
if(tt>0) not empty
else empty
//栈顶
stk[tt];
//************队列
//在队尾插入元素,队尾弹出元素
int q[N],hh,tt=-1;
//弹出
hh++;
//插入
q[++tt]=x;
//判断是否为空
if(hh<=tt) not empty
else empty
//取元素
q(hh)

4.kmp:字符串查找算法

02:20

image-20230113223956832
求Next数组:
	// s[]是模式串,p[]是模板串, n是s的长度,m是p的长度
	for (int i = 2, j = 0; i <= m; i ++ )
	{
		while (j && p[i] != p[j + 1]) j = ne[j];//p[i]!=p[j+1]绿色和红色不匹配时
		if (p[i] == p[j + 1]) j ++ ;
		ne[i] = j;
	}//i是起点

	// 匹配
	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 == m)
		{
			j = ne[j];
	/ 匹配成功后的逻辑
		}
	}

5.trie

用来高效的存储和查找字符串集合的数据结构

例题

6.并查集(重要)集合,数据结构,寻找数用堆。

将两个集合合并,询问两个元素是否在一个集合当中。

基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点存储它的父节点,p【x】表示x的父节点。

int find(int x)
{
    return p[x] == x ? x : p[x] = find(p[x]);
}

例题

食物链

image-20230125112404280 image-20230125112446696
#include <iostream>
using namespace std;
const int N=50010;
int n,m;
int p[N],d[N];
int find(int x)//判断是不是树根
{
    if(p[x]!=x)
    {
        int t=find(p[x]);
        d[x]+=d[p[x]];
        p[x]=t;
    }
    return p[x];
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++)
    {
        p[i]=i;
    }
    int res=0;
    while(m--)
    {
        int t,x,y;
        scanf("%d%d%d",&t,&x,&y);
        if (x > n || y > n) res ++ ;//假话
        else
        {
            int px = find(x), py = find(y);
            if (t == 1)//同类时
            {
                if (px == py && (d[x] - d[y]) % 3) res ++ ;//假话时
                else if (px != py)//不在一个结合时
                {
                    p[px] = py;
                    d[px] = d[y] - d[x];
                }
            }
             else
            {
                if (px == py && (d[x] - d[y] - 1) % 3) res ++ ;
                else if (px != py)
                {
                    p[px] = py;
                    d[px] = d[y] + 1 - d[x];
                }
            }
    }
}
printf("%d\n",res);
return 0;
}

7.堆

1.插入一个数.heap[++size]=x;up(size);

2.求集合中的最小值heap[1];

3.删除最小值heap[1]=heap[size];size--;down(1);

4.删除任意一个元素heap[k]=heap[size];size--;down(k);up(k);

5.修改任意一个元素heap[k]=x;down(k);up(k);

8.哈希表

哈希表的作用:把庞大复杂的数据映射到较小的范围。
可以把数据进行映射,成为哈希函数。
image-20230126172607739

字符串哈希

字符串哈希主要用字符串前缀哈希法解决问题。
image-20230126175825735

image-20230126183107040

image-20230126183130284

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, P = 131;
unsigned long long h[N], p[N];
char str[N];
unsigned long long get(int l, int r) {
    return h[r] - h[l - 1] * p[r - l + 1];
}
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    cin >> str + 1;
    p[0] = 1;
    for (int i = 1; i <= n; i++) {
        p[i] = p[i - 1] * P;
        h[i] = h[i - 1] * P + str[i];
    }
    while (m--) {
        int l1, r1, l2, r2;
        scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
        if (get(l1, r1) == get(l2, r2)) puts("Yes");
        else puts("No");
    }
    return 0;
}

STL

vector 变长数组,倍增的思想

queue队列,push(),front(),pop()

image-20230126190430048

标签:head,idx,int,px,ne,++,数据结构
From: https://www.cnblogs.com/Cathy-cat/p/17068095.html

相关文章

  • 数据结构之顺序表
    顺序表(SeqList)是在计算机内存中以数组形式保存的线性数据结构,同时具有连续的物理存储空间。元素在顺序表中的位置称为索引(index)。顺序表大致分为静态顺序表和动态顺序表......
  • C/C++数据结构课程设计[2023-01-26]
    C/C++数据结构课程设计[2023-01-26]数据结构课程设计第18周(12月26日——12月30日)题目设定:T1:全国交通咨询模拟T2:自拟题目选择其中一题完成!考核办法与成绩评定1......
  • 【奇妙的数据结构世界】用图像和代码对链表的使用进行透彻学习 | C++
    第九章链表:::hljs-center目录第九章链表●前言●一、链表是什么?1.简要介绍2.具体情况●二、链表操作的关键代码段1.类型定义2.常用操作●总结:::......
  • 数据结构
    单调栈单调栈和单调队列都是思维难度比较大的数据结构,但只要想明白了就会觉得很简单。要理解单调栈,首先得明白“单调”是指它存储的内容存在单调性,而不是指它简单。模板......
  • 【奇妙的数据结构世界】 用经典例题对数组进行全面分析 | C++
    ​​​​​​第八章  数组:::hljs-center目录第八章数组●前言●一、数组是什么?1.简要介绍2.具体情况●二、数组典型例题——一维&二维&三维1.一维数组......
  • 数据结构 玩转数据结构 12-1 平衡树和AVL
    0课程地址https://coding.imooc.com/lesson/207.html#mid=14346 1重点关注1.1本节关注重点平衡二叉树的重新定义,标注节点高度,平衡因子 1......
  • 数据结构 玩转数据结构 9-7 更多线段树相关的话题
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13849 1重点关注   2课程内容2.1区间更新懒惰更新方法,使用lazy数......
  • 《数据结构》课程设计任务书[2023-01-24]
    《数据结构》课程设计任务书[2023-01-24]《数据结构》课程设计任务书此任务书仅适用选课储岳中老师的学生QQ群:7492682161(入群密码:2022DS1)一、设计要求仔细阅读《......
  • 数据结构 玩转数据结构 9-6 线段树中的更新操作
    0课程地址https://coding.imooc.com/lesson/207.html#mid=13848 1重点关注1.1线段树中的更新操作见3.1  2课程内容  3......
  • 数据结构
    线段树分治信息线段树要求能维护的信息是含幺半裙。线段树的重点是把区间分裂成若干个小区间,再把这些区间的信息合并。这些区间的信息也由更小的子区间信息合并而成。......