知识总结

一、思维导图

二、重要的概念

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]函数的值刚开始搞不明白是什么该什么得到,但在老师的反复讲解下也明白了。

posted @ 2020-03-28 21:38  awwman  阅读(288)  评论(0编辑  收藏  举报