知识总结
一、思维导图
二、重要的概念
1.绪论
(1)数据是数据(集合)中的一个“个体”,是数据结构中讨论的基本单位。
(2)数据项是数据结构中讨论的最小单位(不可再分)。
(3)结构是数据元素之间存在的关系。
(4)数据的逻辑结构有:集合,线性表,树和图。逻辑结构包括:①数据结构的集合D;②D上的关系集合R,即数据元素之间的关系集合。
(5)数据的存储结构是数据的逻辑结构再计算机中的存储形式。存储结构有顺序存储结构和链式存储结构两种
(6)数据存储时应包括两方面内容:①数据元素;②数据元素之间的逻辑关系。
(7)数据类型是高级程序设计语言中的一个基本概念;顺序存储或链式存储结构,可以借助程序语言中的数组、指针来实现。
(8)数据类型的定义:一组性质相同的值的集合、及定义再此集合上的一组操作的总称。
(9)抽象数据类型树用户定义的、表示应用问题的数学模型以及定义再这个模型上一组操作的总称。包括:数据对象、关系集合、基本操作。
2.算法
(1)算法的定义:对特定问题求解步骤的一种描述,他是指令的有限序列,每一条指令表示一个或多个操作。
(2)算法的特性:有穷性,确定性,可行性,输入和输出。
(3)算法的描述:自然语言,流程图,程序设计语言,伪代码。
(4)算法分析的目标:正确性,可使用性,可读性,健壮性,时间效率高与存储量低。
(5)算法效率分析可以从时间复杂度和空间复杂度两方面研究。
3.线性表
(1)线性表是最简单、最常用的线性结构,线性结构是一个数据元素的有序关系。线性表1是具有相同忒行的数据元素的一个有限序列。
(2)线性表的基本运算:
InitList(&L):初始化线性表
DestroyList(&L):销毁线性表
DispList(L):输出线性表
ListEmpty(L):判断线性表是否为空表
ListL ength(L):返回L中元素的个数
LocateElem(L,e):返回L _中第一个值域与e相等的逻辑位序。若这样的元素不存在,则返回0
GetElem(L,i,&e):用e返回L中第i个元素的值
ListInsert(&L,i,e):在L中第i个元素之前插入e
ListDelete(&L,i,&e):删除L中第i个元素
4.线性表--顺序表
(1)顺序表的定义:使用一块地址连续的存储空间,按照线性表中元素的逻辑顺序依次存放相应元素。
(2)顺序表:
typedef struct
{
ElemType data[MaxSize]; //存放顺序表元素
int length ; //存放顺序表的长度
} List;
(3)顺序表的特点:①逻辑上相邻,物理地址也相邻;②实现随机存储(快速访问)
5.线性表--链表
(1)链表的结构:节点=数据元素+指针。
(2)链表:
①单链表
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next; //指向后继结点
} LNode,*LinkList;
头插法创建链表
void CreateListF(LinkList& L, int n)
{
int i;
LinkList s;
L = new LNode;
L->next = NULL;
for (i = 0; i < n; i++)
{
s = new LNode;
cin >> s->data;
s->next = L->next;
L->next = s;
}
}
尾插法创建链表
void CreateListR(LinkList &L, int n)
{
int i;
LinkList s, r;
L = new LNode;
r = L;
L->next = NULL;
for (i = 0; i < n; i++)
{
s = new LNode;
cin >> s->data;
r ->next = s;
r = s;
}
}
②双链表:节点中有两个指针域,一个指向后续节点一个指向前驱节点。
typedef struct DNode //声明双链表节点类型
{
ElemType data;
struct DNode *prior; //指向前驱节点
struct DNode *next ; //指向后继节点
}}DLinkList;
③循环链表:表中最后-一个节点的指针域不为空,而是指向表头节点,整个链表形成一个环;从表中任一节点出发均可找到链表中其他节点。
④双向循环链表:
(3)链表的特点:线性表中的数据元素存放在一组地址任意的存储节点,节点之间使用“链'进行连接。灵活;不会造成存储空间的浪费。
6.线性表--有序表
(1)有序表的定义:是一种线性表,其中所有元素以递增或者递减的方式有序排列。
(2)有序表有顺序和链式两种存储结构。
7.线性表--栈
(1)栈是限制尽在线性表的一端进行插入和删除运算的线性表;栈是特点为后进先出(LIFO)的线性表。
(2)栈的基本运算:
InitStack(& S): 初始化栈
DestroyStack (&S):销毁栈
StackEmpty(S):判断栈是否为空
Push (&S,e):进栈
Pop(&S,&e):出栈
GetTop(S,&e):取栈项元素
(3)顺序栈
typedef struct{
ElementType data[MaxSize]; /* 存储元素的数组 */
int top; /* 栈顶指针 */
}SqStack;
栈空条件:top=-1;栈满条件top=MaxSize-1.
(4)链栈
typedef struct linknode{
ElemType data;
struct linknode *next;
}LiStack;
栈空条件:s->next=NULL;
(5)STL--stack
入栈,如例:s1.push(x);
出栈,如例:s1.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s1.top()
判断栈空,如例:s1.empty(),当栈空时,返回true。
访问栈中的元素个数,如例:s1.size()
8.线性表--队列
(1)队列是值允许再表的一端进行插入,而在表的另一端进行删除的线性表。队尾(rear)——允许插入的一端,队头(front)——允许删除的一端。队列的特点:先进先出(FIFO)。
(2)队列的基本运算
InitQueue(&q):初始化队列
DestroyQueue(&q):销毁队列
QueueEmpty(q):判断队列是否为空
enQueue (&q,e):入队列
deQueue(&q,&e):出队列
(3)顺序队列
typedef struct {
ElementType data[MaxSize]; /* 存储元素的数组 */
int front; /* 队列的头指针 */
int rear; /* 队列的尾指针 */
}SqQueue;
队空条件:front=rear;队满条件:(rear+1)%MaxSize=front
(4)链队列
typedef struct QNode {// 结点类型
QElemType data;
struct QNode *next ;
} QNode, *QueuePtr;
typedef struct { //链队列类型
QueuePtr front; // 队头指针
QueuePtr rear; //队尾指针
} LinkQueue ;
(5)STL--queue
入队,如例:q1.push(x); 将x接到队列的末端。
出队,如例:q1.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q1.front(),即最早被压入队列的元素。
访问队尾元素,如例:q1.back(),即最后被压入队列的元素。
判断队列空,如例:q1.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q1.size()
9.串
(1)串是有零个或多个字符组成的有限序列。
零个字符的串称为空串。
子串:串中任意个连续的字符组成的子序列。
主串:包含子串的串相应地称为主串。
位置:字符在序列中的序号。
相等:两个串的长度相等,并且对应位置的字符都相同。
(2)串的基本运算
StrAssign(&s,cstr): 串赋值;
StrCopy(&s,t):串复制;
StrEqual(s,t):串相等;
StrLength(s):求串长;
Concat(s,t):串连接;
SubStr(s,i,j):求子串;
InsStr(s1,i,s2): 串插入;
DelStr(s,i,j):串删除;
RepStr(s,i,j,t):串替换;
DispStr(s):串输出。
(3)简单的C++ string
string s; //生成一个空字符串s
string s(str) //拷贝构造函数 生成str的复制品
string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值
string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值
string s(cstr) //将C字符串作为s的初值
string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
string s(num,c) //生成一个字符串,包含num个c字符
string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值
s.~string() //销毁所有字符,释放内存
(4)顺序串
typedef struct {
char *ch; //若是非空串,则按串长分配存储区,
//否则ch为NULL
int length; //串长度
} HString;
(5)链串
typedef struct Chunk { // 结点结构
char ch[ CUNKSIZE] ;
struct Chunk * next;
} Chunk;
typedef struct { 11 串的链表结构
Chunk *head, *tai1; //串的头和尾指针
int curlen; //串的当前长度
} LString;
(6)模式匹配算法
①BF算法(又称古典的、经典的、朴素的、穷举的)
②KMP算法(特点:速度快)
③next[j]函数:定义next[j]函数,表明当模式中第j个字符与主串中相应字符"失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。
疑难问题
1.刚刚接触链表的时候搞不懂链表到底是什么东西,但经过在学习通不断的观看视频,对链表渐渐地有了一定的了解。
2.学习栈和队列的时候碰到很多不明白的地方,例如迷宫问题,循环队列等其他问题。碰到编程难题后多次看代码后,有了一点点懂。
3.串中的next[j]函数的值刚开始搞不明白是什么该什么得到,但在老师的反复讲解下也明白了。