随笔分类 -  数据结构

摘要:对于任意一个非空广义表来说,都是由两部分组成:表头和表尾。反之,只要确定的一个广义表的表头和表尾,那么这个广义表就可以唯一确定下来。复制一个广义表,也是不断的复制表头和表尾的过程。如果表头或者表尾同样是一个广义表,依旧复制其表头和表尾。所以,复制广义表的过程,其实就是不断的递归,复制广义表中表头和表 阅读全文
posted @ 2018-05-15 13:37 程序员进阶笔记 阅读(1398) 评论(0) 推荐(0)
摘要:广义表的长度 通过前一节对广义表的介绍,例子中给出了几个广义表的长度。例如:空表的长度为 0,只含有一个原子的广义表长度为 1,等等。广义表的长度指的是广义表中数据元素的数量。这里需要指明的是,一个广义表中,一个原子算做是一个元素,一个子表也只算做一个元素。在 LS = (a1,a2,…,an) 中 阅读全文
posted @ 2018-05-15 13:31 程序员进阶笔记 阅读(23455) 评论(0) 推荐(2)
摘要:广义表,又称为列表。记作: LS = (a1,a2,…,an) ;( LS 为广义表的名称, an 表示广义表中的数据)。 广义表可以看作是线性表的推广。两者区别是:线性表中的数据元素只能表示单个数据元素;广义表中的单个数据元素 ai ,既可以是单个元素,也可以是广义表。 原子和子表 在广义表中,单 阅读全文
posted @ 2018-05-15 13:24 程序员进阶笔记 阅读(3964) 评论(1) 推荐(1)
摘要:矩阵之间能够进行加法运算的前提条件是:各矩阵的行数和列数必须相等。 在行数和列数都相等的情况下,矩阵相加的结果就是矩阵中对应位置的值相加所组成的矩阵,例如: 图1 矩阵相加 十字链表法 之前所介绍的都是采用顺序存储结构存储三元组,在类似于矩阵的加法运算中,矩阵中的数据元素变化较大(这里的变化主要为: 阅读全文
posted @ 2018-05-15 10:46 程序员进阶笔记 阅读(4557) 评论(0) 推荐(1)
摘要:矩阵相乘的前提条件是:乘号前的矩阵的列数要和乘号后的矩阵的行数相等。且矩阵的乘法运算没有交换律,即 A*B 和 B*A 是不一样的。 例如,矩阵A:矩阵B:由于矩阵 A 的列数和矩阵 B 的行数相等,可以进行 A*B 运算(不能进行 B*A 运算)。计算方法是:用矩阵A的第 i 行和矩阵B中的每一列 阅读全文
posted @ 2018-05-14 15:13 程序员进阶笔记 阅读(3643) 评论(0) 推荐(0)
摘要:矩阵的转置实际上就是将数据元素的行标和列标互换,即 T(i,j) = M(j,i) 。例如: 图1 矩阵的转置 相应地,三元组表转变为: 图2 三元组表 矩阵的转置,经历了三个步骤: 矩阵的行数 n 和列数 m 的值交换; 将三元组中的i和j调换; 转换之后的表同样按照行序(置换前的列序)为主序,进 阅读全文
posted @ 2018-05-14 15:03 程序员进阶笔记 阅读(18204) 评论(0) 推荐(1)
摘要:如果矩阵中有很多数值相同的数据元素,在存储时,可以考虑对其进行适当的压缩存储。 有必要压缩存储的矩阵大致分为两大类: 矩阵中含有大量的相同数值,称为特殊矩阵(例如对称矩阵和上下三角矩阵)。 矩阵中只有极少量的元素是非 0 元素,称为稀疏矩阵。 两类矩阵压缩存储的方法: 特殊矩阵中,对于相同的数据元素 阅读全文
posted @ 2018-05-14 13:45 程序员进阶笔记 阅读(4129) 评论(0) 推荐(0)
摘要:数组,所有的程序设计语言学习之初都有它的身影。根据数组中存储的数据元素之间的逻辑关系,可以将数组分为 : 一维数组、二维数组、…、n维数组。 n维数组中,维数 n 的判断依据是:根据数组中为确定元素所在位置使用的最少的下标个数。例如,二维数组中想唯一确定一个元素的位置,至少需要使用 2 个下标, a[1][1]代表二维数组中行坐标为 1,列坐标为 1 的数据元素的值。 数组VS顺序表 数组和顺... 阅读全文
posted @ 2018-05-14 13:41 程序员进阶笔记 阅读(1902) 评论(0) 推荐(0)
摘要:本章主要介绍了数组和广义表的相关知识。数组章节,重点理解矩阵压缩存储的方式,在此基础上,学习矩阵的转置、乘法、和加法运算的实现;学习广义表时重点理解用递归的思想求广义表的深度和复制广义表。 本章内容: 1. 数据结构之多维数组 2. 矩阵压缩存储(十字链表、三元组顺序表、行逻辑 3. 矩阵转置算法及代码实现(三元组顺序表) 4. 矩阵乘法(行逻辑链接的顺序表)及代码实现 5. 矩阵加法(基于十字... 阅读全文
posted @ 2018-05-14 12:04 程序员进阶笔记 阅读(821) 评论(0) 推荐(0)
摘要:完整实现代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 1000 //KMP算法中的next数组 void Next(char *T, int *next){ int i=1; next[1]=0; 阅读全文
posted @ 2018-05-14 11:36 程序员进阶笔记 阅读(804) 评论(0) 推荐(0)
摘要:通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置。一次次的循环,直到匹配成功或者程序结束。 "KMP"算法相比于"BF" 阅读全文
posted @ 2018-05-14 11:05 程序员进阶笔记 阅读(20375) 评论(4) 推荐(5)
摘要:判断两个串之间是否存在主串与子串的关系,这个过程称为串的模式匹配。 在串的模式匹配过程,子串 T 通常被叫做“模式串”。 普通的模式匹配(“BF”算法) 判断两个串是否存在子串与主串的关系,最直接的算法就是拿着模式串,去和主串从头到尾一一比对,这就是“BF”算法的实现思想。将提供的模式串(例如 “a 阅读全文
posted @ 2018-05-13 20:21 程序员进阶笔记 阅读(1921) 评论(0) 推荐(0)
摘要:数据结构中的字符串 字符串BF算法(普通模式匹配算法) 数据结构中提到的串,即字符串,由 n 个字符组成的一个整体( n >= 0 )。这 n 个字符可以由字母、数字或者其他字符组成。 例如,S = ”BEIJING” ,S 代表这个串的串名,BEIJING 是串的值。 双引号不是串的值,作用只是为了将串和其他结构区分开。 特殊的串 空串:含有零个字符的串。例如:S = “”(双引号中没有任... 阅读全文
posted @ 2018-05-13 19:40 程序员进阶笔记 阅读(3294) 评论(2) 推荐(0)
摘要:字符串(数据结构中的串) 变态的停车场管理系统字符串的存储结构 本章介绍了字符串的三种存储结构,同时介绍了有关进行串的模式匹配的两种算法——普通模式匹配算法以及快速模式匹配算法。 建议读者在掌握普通模式匹配算法的基础上学习快速模式匹配算法,这样会理解地更深刻。 本章内容: 1. 数据结构中的字符串 2. BF算法(普通模式匹配算法)及C语言实现 3. KMP算法(快速模式匹配算... 阅读全文
posted @ 2018-05-13 14:12 程序员进阶笔记 阅读(615) 评论(0) 推荐(0)
摘要:小时候在刚开始接触扑克牌的时候,最初学会的扑克游戏就是类似于“推小车”这样的无脑游戏,本节带领大家使用学过的知识编写推小车卡牌游戏。 “推小车”扑克牌游戏适合 2-3 个人玩,游戏规则也超级简单:将一副扑克牌平均分成两份,每人拿一份,每个人手中的扑克牌全部反面朝上,叠成一摞。游戏进行时,每个人轮流拿 阅读全文
posted @ 2018-05-13 11:27 程序员进阶笔记 阅读(2396) 评论(0) 推荐(0)
摘要:队列(Queue)字符串 实践是检验真理的唯一标准,学习也是如此。本章对栈和队列做了详细的讲解,为了让大家能够学以致用,特推出一个项目供大家练习(包含了本章所有的重要知识点)。 本项目比较烧脑,要求对栈和队列有一定深度的了解,虽有完整代码供大家参考,但是建议先自行完成,然后参照本节给出的完整代码。 阅读全文
posted @ 2018-05-13 11:20 程序员进阶笔记 阅读(4944) 评论(0) 推荐(1)
摘要:队列是线性表的一种,在操作数据元素时,和栈一样,有自己的规则:使用队列存取数据元素时,数据元素只能从表的一端进入队列,另一端出队列,如图1。 图1 队列示意图 称进入队列的一端为“队尾”;出队列的一端为“队头”。数据元素全部由队尾陆续进队列,由队头陆续出队列。 队列的先进先出原则 队列从一端存入数据 阅读全文
posted @ 2018-05-13 11:05 程序员进阶笔记 阅读(14817) 评论(0) 推荐(0)
摘要:在编写代码的时候,经常会用到两种括号:圆括号 “()” 和大括号 “{}” 。不管使用哪种括号,程序编译没有问题的其中一个重要因素就是所使用的括号是否能够匹配上. 在编写程序时,括号可以嵌套,即: “({()})” 这种形式,但 “({)” 或者 “({}” 都不符合要求。括号匹配项目要求:给出任意 阅读全文
posted @ 2018-05-13 09:41 程序员进阶笔记 阅读(9314) 评论(0) 推荐(0)
摘要:进制转换器项目要求:用户提供需要转换的数据和该数据的进制,以及要转换的进制,进制转换器提供给用户最终的正确转换的结果。 转换器实例 例如,用户提供了一个十进制数:10,要求将此数据以二进制形式转换,则通过进制转换器转换的最终结果应该:1010。 提示:此进制转换器可以在 2-36 进制之间对数据进行 阅读全文
posted @ 2018-05-13 09:28 程序员进阶笔记 阅读(1377) 评论(0) 推荐(0)
摘要:栈,线性表的一种特殊的存储结构。与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的。 图1 栈结构示意图 由于栈只有一边开口存取数据,称开口的那一端为“栈顶”,封死的那一端为“栈底”(类似于盛水的木桶,从哪进去的最后还得从哪出来)。 栈的“先进后出”原则 使用 阅读全文
posted @ 2018-05-13 09:14 程序员进阶笔记 阅读(1870) 评论(0) 推荐(0)