![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
PIG_先生
时间都要花在技术上
展开
-
冒泡排序
提示: 假设两个数a和b,将a异或b的值记做temp,即: temp=a^b; 那么temp^ a的值为b,并且temp^b的值为a package sort; import java.util.Arrays; /** * @author Zhujintao 2021/2/5 13:27 * @desc BubbleSort. */ public class BubbleSort { /** * 简单冒泡排序 * @param arr */ pub.原创 2021-02-05 16:37:09 · 93 阅读 · 0 评论 -
归并排序算法
@Adrian 图示过程: (1)归并排序流程: (2)合并两个有序数列的过程: #include <stdio.h> #include <stdlib.h> //自定义合并两个有序数列的过程 int merge(int r[],int s[],int x1,int x2,int x3){ int i,j,k; i = x1;//第一部分开始的位置 ...原创 2020-01-30 13:18:00 · 114 阅读 · 0 评论 -
排序算法
@Adrian 一、插入排序 #include <stdio.h> #include <stdlib.h> //自定义的输入函数 void print(int a[],int n,int i){ printf("%d:",i); for(int j = 0;j<8;j++){ printf("%d",a[j]); } ...原创 2020-01-28 01:52:30 · 78 阅读 · 0 评论 -
二叉树---后序遍历(递归)
@Adrian 二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素。 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 开始,遍历该节点的左子树(以节点 2 为根节点); 遍历节点 2 的左子树(以节点 4 为根节点); 由于节点 4 既没有左子树,也没有右子树,此时访问该节点中的元素 4,并回退到节点 2 ,遍...原创 2020-01-17 21:44:08 · 4335 阅读 · 1 评论 -
二叉树---中续遍历(递归)
@Adrian 二叉树中序遍历的实现思想是: 访问当前节点的左子树; 访问根节点; 访问当前节点的右子树; 以图 1 为例,采用中序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 遍历节点 1 的左子树,找到节点 2; 遍历节点 2 的左子树,找到节点 4; 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树; 由于节点 4 无右子树,因此节点...原创 2020-01-17 21:36:08 · 174 阅读 · 0 评论 -
二叉树---先序遍历(递归)
@Adrian 二叉树先序遍历的实现思想是: 访问根节点; 访问当前节点的左子树; 若当前节点无左子树,则访问当前节点的右子树; 以图 1 为例,采用先序遍历的思想遍历该二叉树的过程为: 访问该二叉树的根节点,找到 1; 访问节点 1 的左子树,找到节点 2; 访问节点 2 的左子树,找到节点 4; 由于访问节点 4 左子树失败,且也没有右子树,因此以节点 4 为根节点的子树遍历...原创 2020-01-17 21:25:47 · 3101 阅读 · 0 评论 -
树存储结构---二叉树的链式存储结构
@Adrian 普通二叉树示意图: 如图 1 所示,此为一棵普通的二叉树,若将其采用链式存储,则只需从树的根节点开始,将各个节点及其左右孩子使用链表存储即可。因此,图 1 对应的链式存储结构如图 2 所示: 由图 2 可知,采用链式存储二叉树时,其节点结构由 3 部分构成(如图 3 所示): 指向左孩子节点的指针(Lchild); 节点存储的数据(data); 指向右孩子节点的指针(Rchi...原创 2020-01-17 16:35:32 · 1141 阅读 · 0 评论 -
字符串---KMP算法(快速模式匹配算法)
@Adrian "KMP"算法称为“快速模式匹配算法” KMP"算法相比于"BF"算法,优势在于: 在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离; 并且可以在O(n+m)的时间数量级上完成对串的模式匹配操作; 模式串向右移动的距离计算 在模式串和主串匹配时,各有一个指针指向当前进行匹配的字符(主串中是指针 i ,模式串中是指针 j ),在保证 i 指针不回溯的前提下...原创 2020-01-17 15:36:25 · 462 阅读 · 0 评论 -
字符串---BF算法(串模式匹配算法)
@Adrian 串的模式匹配算法,通俗地理解,是一种用来判断两个串之间是否具有"主串与子串"关系的算法。 实现串的模式匹配的算法主要有以下两种: 1. 普通的模式匹配算法; 2. 快速模式匹配算法; BF算法原理: 普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果。 例如,使用普通模式匹配算法判断串 A(“abcac”)是否为串 B(“aba...原创 2020-01-17 14:15:33 · 1488 阅读 · 1 评论 -
字符串---串的块链存储结构
@Adrian 串的块链存储,指的是使用链表结构存储字符串。 我们知道,单链表中的 “单” 强调的仅仅是链表各个节点只能有一个指针,并没有限制数据域中存储数据的具体个数。因此在设计链表节点的结构时,可以令各节点存储多个数据。 该链表各个节点中可存储 1 个字符: 设置的链表各节点可存储 4 个字符: 链表各节点存储数据个数的多少可参考以下几个因素: 1、串的长度和存储空间的大小:若串包含数...原创 2020-01-17 13:42:46 · 1640 阅读 · 0 评论 -
字符串---串的堆分配存储结构
@Adrian 串的堆分配存储,其具体实现方式是采用动态数组存储字符串。 通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区域,分别为堆区、栈区、数据区和代码区,其中的堆区是本节所关注的。 与其他区域不同,堆区的内存空间需要程序员手动使用 malloc 函数申请,并且在不用后要手动通过 free 函数将...原创 2020-01-17 13:09:32 · 1266 阅读 · 0 评论 -
栈和队列---4链式队列
@Adrian 链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素,如图 1 所示: 图 1 所示为链式队列的初始状态,此时队列中没有存储任何数据元素,因此 top 和 rear 指针都同时指向头节点。 链式队列数据入队 链队队列中,当有新的数据元素入队,只需进行以下 3 步操作: 将该数据元素用节点包裹,例如新节点名称为 ...原创 2020-01-17 12:43:52 · 133 阅读 · 0 评论 -
栈和队列---3顺序队列
@Adrian 一、顺序队列简单实现 由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素,如图 1 所示: 由于顺序队列初始状态没有存储任何元素,因此 top 指针和 rear 指针重合,且由于顺序队列底层实现靠...原创 2020-01-16 21:26:05 · 100 阅读 · 0 评论 -
栈和队列---2链栈
@Adrian 链栈元素入栈 例如,将元素 1、2、3、4 依次入栈,等价于将各元素采用头插法依次添加到链表中,每个数据元素的添加过程如图 2 所示: 链栈元素出栈 例如,图 2e) 所示的链栈中,若要将元素 3 出栈,根据"先进后出"的原则,要先将元素 4 出栈,也就是从链表中摘除,然后元素 3 才能出栈,整个操作过程如图 3 所示: 链栈完整代码: #include <stdio.h...原创 2020-01-16 17:10:45 · 115 阅读 · 0 评论 -
栈和队列---1顺序栈
@Adrian 顺序栈元素"入栈" 比如,还是模拟栈存储 {1,2,3,4} 的过程。最初,栈是"空栈",即数组是空的,top 值为初始值 -1,如图 3 所示: 首先向栈中添加元素 1,我们默认数组下标为 0 一端表示栈底,因此,元素 1 被存储在数组 a[1] 处,同时 top 值 +1,如图 4 所示: 采用以上的方式,依次存储元素 2、3 和 4,最终,top 值变为 3,如图 5 所...原创 2020-01-16 16:49:48 · 291 阅读 · 0 评论 -
线性表---5循环链表(约瑟夫环)
@Adrian 实现约瑟夫环 约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。 如图 2 所示,假设此时圆周周围有 5 个人,要求从编号为 3 的人开始顺时针...原创 2020-01-16 16:22:11 · 324 阅读 · 0 评论 -
线性表---3静态链表
@Adrian 通过上面的学习我们知道,静态链表存储数据元素也需要自定义数据类型,至少需要包含以下 2 部分信息: 数据域:用于存储数据元素的值; 游标:其实就是数组下标,表示直接后继元素所在数组中的位置; #include <stdio.h> #define maxSize 7 typedef struct { char data; int cur; }com...原创 2020-01-16 15:18:38 · 99 阅读 · 0 评论 -
线性表---2单链表(c语言)
@Adrian 1、数据元素本身,其所在的区域称为数据域; 指向直接后继元素的指针,所在的区域称为指针域; #include <stdio.h> #include <stdlib.h> //声明结点结构 typedef struct Link{ int elem;//存储整形元素 struct Link *next;//指向直接后继的元素的指针 }...原创 2020-01-16 13:50:20 · 158 阅读 · 0 评论 -
线性表---1顺序表
@Adrian #include <stdio.h> #include <stdlib.h> #define Size 5 typedef struct Table{ int *head; int length; int size; }table; //初始化顺序表 table initTable(){ table t; t.he...原创 2020-01-16 13:44:51 · 106 阅读 · 0 评论 -
线性表---4双向链表
@Adrian 1、指针域:用于指向当前节点的直接前驱节点; 2、数据域:用于存储数据元素。 3、指针域:用于指向当前节点的直接后继节点; 双链表中对数据进行 “增删查改” 操作的完整实现代码 #include <stdio.h> #include <stdlib.h> //双向链表 typedef struct line{ struct line*prior...原创 2020-01-16 13:38:53 · 106 阅读 · 0 评论 -
链表的中间结点
【题目描述】 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 【示例 1】 输入:[1,2,3,4,5] 输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.n...原创 2019-12-02 20:50:42 · 58 阅读 · 0 评论