
数据结构
PIG_先生
时间都要花在技术上
展开
-
冒泡排序
提示:假设两个数a和b,将a异或b的值记做temp,即:temp=a^b;那么temp^ a的值为b,并且temp^b的值为apackage 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 · 130 阅读 · 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 · 148 阅读 · 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 · 118 阅读 · 0 评论 -
二叉树---后序遍历(递归)
@Adrian二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素。如图 1 中,对此二叉树进行后序遍历的操作过程为:从根节点 1 开始,遍历该节点的左子树(以节点 2 为根节点);遍历节点 2 的左子树(以节点 4 为根节点);由于节点 4 既没有左子树,也没有右子树,此时访问该节点中的元素 4,并回退到节点 2 ,遍...原创 2020-01-17 21:44:08 · 4671 阅读 · 1 评论 -
二叉树---中续遍历(递归)
@Adrian二叉树中序遍历的实现思想是:访问当前节点的左子树;访问根节点;访问当前节点的右子树;以图 1 为例,采用中序遍历的思想遍历该二叉树的过程为:访问该二叉树的根节点,找到 1;遍历节点 1 的左子树,找到节点 2;遍历节点 2 的左子树,找到节点 4;由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树;由于节点 4 无右子树,因此节点...原创 2020-01-17 21:36:08 · 221 阅读 · 0 评论 -
二叉树---先序遍历(递归)
@Adrian二叉树先序遍历的实现思想是:访问根节点;访问当前节点的左子树;若当前节点无左子树,则访问当前节点的右子树;以图 1 为例,采用先序遍历的思想遍历该二叉树的过程为:访问该二叉树的根节点,找到 1;访问节点 1 的左子树,找到节点 2;访问节点 2 的左子树,找到节点 4;由于访问节点 4 左子树失败,且也没有右子树,因此以节点 4 为根节点的子树遍历...原创 2020-01-17 21:25:47 · 3212 阅读 · 0 评论 -
树存储结构---二叉树的链式存储结构
@Adrian普通二叉树示意图:如图 1 所示,此为一棵普通的二叉树,若将其采用链式存储,则只需从树的根节点开始,将各个节点及其左右孩子使用链表存储即可。因此,图 1 对应的链式存储结构如图 2 所示:由图 2 可知,采用链式存储二叉树时,其节点结构由 3 部分构成(如图 3 所示):指向左孩子节点的指针(Lchild);节点存储的数据(data);指向右孩子节点的指针(Rchi...转载 2020-01-17 16:35:32 · 1233 阅读 · 0 评论 -
字符串---KMP算法(快速模式匹配算法)
@Adrian"KMP"算法称为“快速模式匹配算法”KMP"算法相比于"BF"算法,优势在于:在保证指针 i 不回溯的前提下,当匹配失败时,让模式串向右移动最大的距离;并且可以在O(n+m)的时间数量级上完成对串的模式匹配操作;模式串向右移动的距离计算在模式串和主串匹配时,各有一个指针指向当前进行匹配的字符(主串中是指针 i ,模式串中是指针 j ),在保证 i 指针不回溯的前提下...原创 2020-01-17 15:36:25 · 550 阅读 · 0 评论 -
字符串---BF算法(串模式匹配算法)
@Adrian串的模式匹配算法,通俗地理解,是一种用来判断两个串之间是否具有"主串与子串"关系的算法。实现串的模式匹配的算法主要有以下两种:1. 普通的模式匹配算法;2. 快速模式匹配算法;BF算法原理:普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果。例如,使用普通模式匹配算法判断串 A(“abcac”)是否为串 B(“aba...原创 2020-01-17 14:15:33 · 1601 阅读 · 1 评论 -
字符串---串的块链存储结构
@Adrian串的块链存储,指的是使用链表结构存储字符串。我们知道,单链表中的 “单” 强调的仅仅是链表各个节点只能有一个指针,并没有限制数据域中存储数据的具体个数。因此在设计链表节点的结构时,可以令各节点存储多个数据。该链表各个节点中可存储 1 个字符:设置的链表各节点可存储 4 个字符:链表各节点存储数据个数的多少可参考以下几个因素: 1、串的长度和存储空间的大小:若串包含数...转载 2020-01-17 13:42:46 · 1763 阅读 · 0 评论 -
字符串---串的堆分配存储结构
@Adrian串的堆分配存储,其具体实现方式是采用动态数组存储字符串。通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区域,分别为堆区、栈区、数据区和代码区,其中的堆区是本节所关注的。与其他区域不同,堆区的内存空间需要程序员手动使用 malloc 函数申请,并且在不用后要手动通过 free 函数将...转载 2020-01-17 13:09:32 · 1320 阅读 · 0 评论 -
栈和队列---4链式队列
@Adrian链式队列的实现思想同顺序队列类似,只需创建两个指针(命名为 top 和 rear)分别指向链表中队列的队头元素和队尾元素,如图 1 所示:图 1 所示为链式队列的初始状态,此时队列中没有存储任何数据元素,因此 top 和 rear 指针都同时指向头节点。链式队列数据入队链队队列中,当有新的数据元素入队,只需进行以下 3 步操作:将该数据元素用节点包裹,例如新节点名称为 ...原创 2020-01-17 12:43:52 · 174 阅读 · 0 评论 -
栈和队列---3顺序队列
@Adrian一、顺序队列简单实现由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素,如图 1 所示:由于顺序队列初始状态没有存储任何元素,因此 top 指针和 rear 指针重合,且由于顺序队列底层实现靠...原创 2020-01-16 21:26:05 · 125 阅读 · 0 评论 -
栈和队列---2链栈
@Adrian链栈元素入栈例如,将元素 1、2、3、4 依次入栈,等价于将各元素采用头插法依次添加到链表中,每个数据元素的添加过程如图 2 所示:链栈元素出栈例如,图 2e) 所示的链栈中,若要将元素 3 出栈,根据"先进后出"的原则,要先将元素 4 出栈,也就是从链表中摘除,然后元素 3 才能出栈,整个操作过程如图 3 所示:链栈完整代码:#include <stdio.h...原创 2020-01-16 17:10:45 · 139 阅读 · 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 · 325 阅读 · 0 评论 -
线性表---5循环链表(约瑟夫环)
@Adrian实现约瑟夫环约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。如图 2 所示,假设此时圆周周围有 5 个人,要求从编号为 3 的人开始顺时针...原创 2020-01-16 16:22:11 · 394 阅读 · 0 评论 -
线性表---3静态链表
@Adrian通过上面的学习我们知道,静态链表存储数据元素也需要自定义数据类型,至少需要包含以下 2 部分信息:数据域:用于存储数据元素的值;游标:其实就是数组下标,表示直接后继元素所在数组中的位置;#include <stdio.h>#define maxSize 7typedef struct { char data; int cur;}com...原创 2020-01-16 15:18:38 · 154 阅读 · 0 评论 -
线性表---2单链表(c语言)
@Adrian1、数据元素本身,其所在的区域称为数据域;指向直接后继元素的指针,所在的区域称为指针域;#include <stdio.h>#include <stdlib.h>//声明结点结构typedef struct Link{ int elem;//存储整形元素 struct Link *next;//指向直接后继的元素的指针}...原创 2020-01-16 13:50:20 · 191 阅读 · 0 评论 -
线性表---1顺序表
@Adrian#include <stdio.h>#include <stdlib.h>#define Size 5typedef struct Table{ int *head; int length; int size;}table;//初始化顺序表table initTable(){ table t; t.he...原创 2020-01-16 13:44:51 · 142 阅读 · 0 评论 -
线性表---4双向链表
@Adrian1、指针域:用于指向当前节点的直接前驱节点;2、数据域:用于存储数据元素。3、指针域:用于指向当前节点的直接后继节点;双链表中对数据进行 “增删查改” 操作的完整实现代码#include <stdio.h>#include <stdlib.h>//双向链表typedef struct line{ struct line*prior...原创 2020-01-16 13:38:53 · 133 阅读 · 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 · 80 阅读 · 0 评论