数据结构

数据结构是一门研究数据组织存储和运算的一般方法的学科。

数据结构中有几种类型

  • 线性表

​ 逻辑特征:一对一

​ 直接前驱,直接后驱,开始结点,终端结点

  • 逻辑特征:一对多

    有且只有一个根节点,

    除根节点外,每个节点都有且只有一个唯一的前驱

    除叶子结点外,每个节点都有后继结点

  • 逻辑结构:多对多

数据结构的存储类型分类:

顺序存储:按照给定的顺序进行存储

链式存储:使用链的形式进行存储

散列存储

索引存储

算法

一个算法是由若干的指令组成的有序数组

性质

  • 有穷性:算法在有穷的步数中结束,每一步都在有穷的时间内完成
  • 确定性:每条指令的含义都必须明确
  • 可行性:能够由机器人或者计算机或者人完成

检验一个算法的好坏

  • 正确性:能否满足预先的功能和性能要求
  • 可读性:算法是够可读,易读
  • 健壮性:当输入非法时,算法是否能及时给出反馈
  • 时间效率和空间效率:两个复杂度

时间复杂度和空间复杂度

时间复杂度:执行当前算法所消耗的时间

空间复杂度:执行当前算法所占用的内存

https://www.yuque.com/vernus-u2vmo/tgvyrt/to9tln8g55kvhl0y?singleDoc#

线性表和链表

线性表

基本概念:一个数据元素的有序集,其基本特征

  • 集合中存在唯一的一个第一个元素
  • 集合中存在唯一的一个最后一个元素
  • 除第一个元素外都存在为一个直接前驱
  • 除最后一个元素外都存在唯一的一个直接后驱
顺序表的建立
1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#include<stdlib.h>
typedef int Datatype;
struct List
{
int MAX;
int n;
DataType *elem;
};
typedef struct List*SeqList;
顺序表的判空
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SeqList SetNullList_seq(int m)
{
SeqList slist=(SeqList)malloc(sizeof(struct List));
if(slist!=NULL)
{
slist->elem=(DataType*)malloc(sizeof(DataType)*m);
if(slist->elem)
{
slist->Max=m;
slist->n=0;
return(slist);
}
else free(slist);
}
printf("ALLoc failure!\n");
return NULL;
}

顺序表的插入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int InsertPre_seq(SeqList slist,int p,DataType x)
{
int q;
if(slist->n>=slist->Max)
{
printf("overflow");
return 0;
}
if(p<0||p>slist->n)
{
printf("not exist!\n");
return 0;
}
for(q=slist->n-1;q>=p;q--)
slist->elem[q+1]=slist->elem[q];
slist->elem[p]=x;
slist->n=slist->n+1;
return 1;
}

顺序表的删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int DelIndex_seq(SeqList slist,int p)
{
int q;
if(p<0||p>=slist->n)
{
printf("Not exist");
return 0;
}
for(q=p;q<slist->n-1;q++)
{
slist ->elem[q]=slist ->elem[q+1];
}
slist ->n=slist->n-1;
return 1;
}

二分查找
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int binsearch(SeqList slist,int key,int *pos)
{
int index=1;int mid;
int low = 0;int high=slist->n-1;
while(low<=high)
{
if(slist->ekem[mid]==key)
{
*pos=mid;
printf("已经找到,共进行%d次比较\n",index);
printf("要找到的数据%d在位置%d上\n",key,mid);
return 1;
}
else if (slist->elem[mid]>key)
{
high = mid -1;
}
else low = mid + 1;
index++;
}
*pos = llow;
printf("没找到,共进行%d次比较\n",index-1);
printf("可以在%d上插入位置\n",*pos);
}

特性:

​ 后进先出

分类:

​ 顺序栈

​ 链栈

应用:

前缀中缀表达式

https://www.yuque.com/vernus-u2vmo/tgvyrt/zh4geied5wd2ldpm?singleDoc# 《栈的应用》

计算器

单调栈(例题——洛谷《音乐会的等待》)

队列

特性:

先进先出,跟栈相反

分类

单队列

假溢出

循环队列

需要一个闲置的空区

可以解决顺序队列中的假溢出和越界问题