数据结构总结
一、思维导图
二、基本概念
1.数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等。
2.逻辑结构:数据之间的相互关系。
3.顺序存储结构中,线性表的逻辑顺序和物理顺序总是一致的。但在链式存储结构中,线性表的逻辑顺序和物理顺序一般是不同的。
4.时间复杂度:顺序表、链表删除、插入元素平均时间复杂度为o(n)。
5.空间复杂度:若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间。
线性表
一.线性表的顺序存储结构:把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。特点是随机存储,线性表中第个元素的位置LOC(ai)=LOC(a1)+(i-1)*len.
插入:插入新结点,之后结点后移。平均时间复杂度:O(n)
删除:删除节点,之后结点前移。平均时间复杂度:O(n)
二.线性表的链式存储结构:线性表中的元素存放在一组地址任意的存储节点,节点之间通过指针链接起来。
1.单链表
2.双向链表
3.循环链表
头插法建立链表
具体代码实现
void CreateListF(LinkList& L, int n)
{
L = new LNode;
L->next = NULL;
int i;
LinkList s;
for (i = 0; i < n; i++)
{
s = new LNode;
cin >> s->data;
s->next = L->next;
L->next = s;
}
}
如,插入元素为 1 2 3 4 5,插入以后的结果为 5 4 3 2 1
尾插法建立链表
具体代码实现
void CreateListR(LinkList &L, int n)
{
LinkList s, r;
L = new LNode;
r = L;
int i;
for (i = 0;i < n;i++)
{
s = new LNode;
cin >> s->data;
r->next = s;
r = s;
}
r->next = NULL;
}
如,插入元素为 1 2 3 4 5,插入以后的结果为 1 2 3 4 5
栈
栈(Stack)是限制在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。先进后出。top= -1时为空栈,top=0只能说明栈中只有一个元素,并且元素进栈时top++。
特点:后进先出(FILO)
应用:数值转换、括号匹配、表达式求值、实现递归
队列
队列:只允许在表的一端进行插入,另一端进行删除的线性表。
特点:先进先出(FIFO)
顺序队列:顺序存储结构。当头尾指针相等时队列为空。在非空队列里,头指针始终指向队头前一个位置,而尾指针始终指向队尾元素的实际位置
循环队列。在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(MaxSize-1)时,其加1操作的结果是指向向量的下界0。除非向量空间真的被队列元素全部占用,否则不会上溢。
队空条件:rear == fronf
队满条件:(rear+1) % m == front,其中m为循环队列的最大长度
入队:(rear+1)% m
出队:(front+1)% m
计算队列长度:(rear-front+m)% m
应用:排队、医院挂号、打印机、操作系统
串
串:是由零个或多个字符组成的有限序列。长度为零的串称为空串,它不包含任何字符。
串和线性表的区别:
串是一种特殊的线性表,其中元素全部为字符型;
串通常以整体作为操作的对象,而线性表通常以单个元素作为操作的对象。
串的模式匹配
1.BF算法
BF算法的思想:将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。
2.KMP算法
KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。