数据结构与算法
文章平均质量分 76
关于数据结构与算法的基本使用,基于Java语言实现
LatteCK
想要的东西都很贵,只能不断地努力奔跑
同是风华正茂,怎可甘拜下风
展开
-
算法小技巧
算法小技巧一、数位和增量公式int sums(int x) int s = 0; while(x != 0) { s += x % 10; x = x / 10; } return s;数位和增量公式: 设 x的数位和为 s_x,x + 1的数位和为 s_x+11、当(x+1)⊙10=0 时: s_x + 1 = s_x - 8 ,例如19,数位和为:102、 当(x+1)⊙10 != 0 时: s_x + 1 = s_x + 1原创 2021-11-21 20:49:32 · 946 阅读 · 0 评论 -
马踏棋盘算法
马踏棋盘算法马踏棋盘算法介绍和游戏演示马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的 8×8 棋盘 Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部 64 个方格马踏棋盘游戏代码实现马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用。如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个,坐标(1,0),发现已经走到尽头,没办法,那就只能回退了,查看原创 2021-04-18 19:26:40 · 145 阅读 · 0 评论 -
弗洛伊德算法
弗洛伊德算法弗洛伊德(Floyd)算法介绍和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978 年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。弗洛伊德算法 VS 迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一原创 2021-04-18 18:26:19 · 253 阅读 · 0 评论 -
迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。迪杰斯特拉(Dijkstra)算法过程设置出发顶点为 v,顶点集合 V{v1,v2,vi…},v 到 V 中各顶点的距离构成距离集合 Dis,Dis{d1,d2,di…},Dis集合记录着 v 到图中各顶点的距离(到自身可以看作 0,v 到 vi 距离对应为 di)从 Dis 中选择原创 2021-04-18 16:07:27 · 537 阅读 · 0 评论 -
克鲁斯卡尔算法
克鲁斯卡尔算法应用场景-公交站问题看一个应用场景和问题:某城市新增 7 个站点(A, B, C, D, E, F, G) ,现在需要修路把 7 个站点连通各个站点的距离用边线表示(权) ,比如 A – B 距离 12 公里问:如何修路保证各个站点都能连通,并且总的修建公路总里程最短?克鲁斯卡尔算法介绍克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择 n-1 条边,并保证这 n-1 条边不构成回路具体做法:首先构造一原创 2021-04-18 14:23:31 · 1589 阅读 · 0 评论 -
普里姆算法
普里姆算法应用场景-修路问题看一个应用场景和问题:有胜利乡有 7 个村庄(A, B, C, D, E, F, G) ,现在需要修路把 7 个村庄连通各个村庄的距离用边线表示(权) ,比如 A – B 距离 5 公里问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?思路: 将 10 条边,连接即可,但是总的里程数不是最小. 正确的思路,就是尽可能的选择少的路线,并且每条路线最小,保证总里程数最少最小生成树修路问题本质就是就是最小生成树问题, 先介绍一下最小生成树(Mi原创 2021-04-16 23:09:03 · 192 阅读 · 0 评论 -
贪心算法-java版
贪心算法贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果集合覆盖问题假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号思路分析: 如何找出覆盖所有地区的广播台的集合呢,使用穷举法实现,列出每个可能的广播台的集合,这原创 2021-04-13 13:22:48 · 369 阅读 · 0 评论 -
KMP 算法
KMP 算法字符串匹配问题字符串匹配问题::有一个字符串 str1="“javamysql”",和一个子串 str2="java "现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1一、暴力匹配算法如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有:如果当前字符匹配成功(即 str1[i]==str2[j]),则 i++,j++,继续匹配下一个字符如果失配(即 str1[i]!=st原创 2021-04-12 22:41:55 · 148 阅读 · 0 评论 -
动态规划算法
动态规划算法应用场景-背包问题背包问题:有一个背包,容量为 4 磅 , 现有如下物品要求达到的目标为装入的背包的总价值最大,并且重量不超出要求装入的物品不能重复动态规划算法介绍动态规划(DynamicProgramming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得原创 2021-04-11 16:18:15 · 339 阅读 · 0 评论 -
分治算法--Java版
分治算法一、 分治算法介绍分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题 的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变 换)……分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并排序快速排序线性时间选择最接近点对问题循环赛日程表汉诺塔二、分治算法的基本步骤分治法在原创 2021-04-09 22:19:24 · 369 阅读 · 0 评论 -
图-----Java版
图一、图基本介绍为什么要有图线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图。图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:图的常用概念顶点(vertex)边(edge)路径无向图有向图带权图二、图的表示方式图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。邻接矩阵原创 2021-04-09 19:30:34 · 77 阅读 · 0 评论 -
多路查找树
多路查找树一、二叉树与 B 树二叉树的问题分析 二叉树的操作效率较高,但是也存在问题, 请看下面的二叉树二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如 1 亿), 就 存在如下问题:问题 1:在构建二叉树时,需要多次进行 i/o 操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题 2:节点海量,也会造成二叉树的高度很大,会降低操作速度.二、多叉树在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多原创 2021-04-09 16:37:23 · 89 阅读 · 0 评论 -
平衡二叉树(AVL 树)
平衡二叉树(AVL 树)给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在左边 BST 存在的问题分析:左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥 BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢解决方案-平衡二叉树(AVL)一、基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancingbinarysearchtree)又被称为 AVL 树,原创 2021-04-09 13:30:15 · 143 阅读 · 0 评论 -
二叉排序树
二叉排序树给你一个数列 (7,3,10,12,5,1,9),要求能够高效的完成对数据的查询和添加使用数组 数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位 置后,后面的数据需整体移动,速度慢。使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动使用二叉排序树一、二叉排序树介绍二叉排序树:BST:(BinarySort(Search)Tree),原创 2021-04-08 21:51:17 · 168 阅读 · 0 评论 -
赫夫曼编码数据压缩
赫夫曼编码数据压缩一、基本介绍赫夫曼编码也翻译为 哈夫曼编码(HuffmanCoding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在 20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman 于 1952 年提出一种编码方法,称之为最佳编码二、 原理剖析通信领域中信息的处理方式 1-定长编码通信领域中信息的处理方式 2-变长编码通信领域中信息的处理方式 3-原创 2021-04-07 21:28:06 · 635 阅读 · 1 评论 -
赫夫曼树---Java版
赫夫曼树一、基本介绍给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(HuffmanTree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近二、赫夫曼树几个重要概念和举例说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1原创 2021-04-07 17:02:06 · 149 阅读 · 1 评论 -
堆排序--java版
堆排序一、堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆举例说明小顶堆举例说明一般升序采用大顶堆,降序采用小顶堆二、堆排序基本思想堆排序的基本思想是:将待排序序列构原创 2021-04-07 16:23:48 · 177 阅读 · 0 评论 -
线索化二叉树
线索化二叉树先看一个问题将数列 {1,3,6,8,10,14 } 构建成一颗二叉树. n+1=7当我们对上面的二叉树进行中序遍历时,数列为 {8,3,10,1,14,6}但是 6,8,10,14 这几个节点的 左右指针,并没有完全的利用上.如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办?解决方案-线索二叉树一、线索二叉树基本介绍n 个结点的二叉链表中含有 n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向原创 2021-04-07 15:43:35 · 96 阅读 · 1 评论 -
顺序存储树
顺序存储树一、 顺序存储二叉树的概念从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组顺序二叉树通常只考虑完全二叉树第 n 个元素的左子节点为 2*n+1第 n 个元素的右子节点为 2*n+2第 n 个元素的父节点为 (n-1)/2 5) n: 表示二叉树中的第几个元素(按 0 开始编号如图所示)具体实现如下://顺序存储二叉树遍历class ArrBinaryTree { //存储的数组 private int[] ar原创 2020-11-18 17:26:16 · 1005 阅读 · 0 评论 -
二叉树遍历与查找简单删除
二叉树遍历与查找、简单删除一、遍历使用前序,中序和后序对下面的二叉树进行遍历.前序遍历: 先输出父节点,再遍历左子树和右子树中序遍历: 先遍历左子树,再输出父节点,再遍历右子树后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点小结: 看输出父节点的顺序,就确定是前序,中序还是后序二、查找三、简单删除如果删除的节点是叶子节点,则删除该节点如果删除的节点是非叶子节点,则删除该子树.//二叉树class BinaryTree { //根结点 private原创 2020-11-16 23:50:22 · 135 阅读 · 0 评论 -
树基础知识
树基础知识一、 为什么需要树这种数据结构数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]画出操作示意图:2. 链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。 缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历) 【示意图】操作示意图:3.原创 2020-11-16 15:34:53 · 486 阅读 · 0 评论 -
哈希表
哈希表散列表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。google 公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 id 时, 要求查找到该员工的 所有信息.要求:不使用数据库,速度越快越好=>哈希表(散列)添加时,保证按照 id原创 2020-11-16 15:10:43 · 67 阅读 · 0 评论 -
斐波那契数列查找算法
斐波那契数列查找算法黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意向不大的效果。斐波那契数列 {1,1,2,3,5,8,13,21,34,55} 发现斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值 0.6188.5.2斐波那契(黄金分割法)原理: 斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid原创 2020-11-16 12:37:06 · 500 阅读 · 0 评论 -
插值查找
插值查找插值查找原理介绍: 插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。将折半查找中的求 mid 索引的公式 ,low 表示左边索引 left,high 表示右边索引 right. key 就是上一篇的findValintmid=low+(high-low)(key-arr[low])/(arr[high]-arr[low]) ;/插值索引/对应前面的代码公式: intmid=left+(right – left)(findVal – arr[left])/(ar原创 2020-10-26 20:39:38 · 117 阅读 · 0 评论 -
二分查找(递归与非递归)
二分查找思路:注意二分查找只能用于有序的数组,无序的不能使用二分查找算法具体实现如下://查找单值的二分查找 public static int binarySearch(int [] arr,int left,int right,int findval) { //如果左边的大于右边的说明没有找到 if (left>right) { return -1; } //找到中间原创 2020-10-26 15:33:26 · 340 阅读 · 0 评论 -
排序看这一篇就够了
排序看这一篇就够了文章目录一、冒泡排序二、选择排序三、插入排序四、希尔排序五、快速排序六、归并排序七、基数排序/桶排序总结里面包含了,排序算法的思想和实现,如果发现bug,欢迎在评论里面提出来...原创 2020-10-26 11:38:13 · 126 阅读 · 0 评论 -
基数排序或桶排序
基数排序或桶排序(1) 基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucket sort)或 binsort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用(2) 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法(3) 基数排序(RadixSort)是桶排序的扩展(4) 基数排序是 1887 年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。原创 2020-10-25 12:50:07 · 225 阅读 · 0 评论 -
归并排序
归并排序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。归并排序先把每一个分开,然后在合并的时候排序时间跟快速排序差不多定义一个左指针一个右指针,一个中间变量,一个临时数组分开后,对比两个合并,先存放小的,然后存大的,然后把剩下的存储进去具体实现如下:/**原创 2020-10-24 15:40:23 · 107 阅读 · 0 评论 -
快速排序
快速排序快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 。一、定义两个指针一个在左边一个在右边,然后再定义一个数在中间,进行比较在左边找大于中间的数,在右边找小于中间的数,然后交换二、然后分别进行左边递归和右边递归快速排序是冒泡排序的改进版,消耗空间比较多,时间比较快,快于希尔排序原创 2020-10-23 22:37:04 · 122 阅读 · 0 评论 -
希尔排序
希尔排序希尔排序是希尔(DonaldShell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含 的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。希尔排序按照步长减少排序的次数,按照步长分为不同的组,每组进行比较,然后排序,本质上还是插入排序。一、交换法这个交换耗费的时间比较多具体实现如下:原创 2020-10-22 18:31:38 · 160 阅读 · 2 评论 -
插入排序
插入排序插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序(InsertionSorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表具体实现如下://插入排序 public static void insertS原创 2020-10-21 15:20:09 · 105 阅读 · 0 评论 -
选择排序
选择排序选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换,第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换,第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换,…,第 i 次从 arr[i-1]~arr[n-1]中选取最小值,与 arr[原创 2020-10-19 21:14:23 · 100 阅读 · 0 评论 -
八皇后
八皇后1.通过递归回溯来判断路线2.先放第一行第一列,然后放第二个是否合适,放完第三个再回溯看与之前是否冲突具体实现如下:public class BaHuangHou { public static void main(String[] args) { BaHuangHou baHuangHou=new BaHuangHou(); baHuangHou.check(0); System.out.printf("一共有%d解法",count)原创 2020-10-19 12:00:24 · 104 阅读 · 0 评论 -
递归与递归实现迷宫问题
递归与递归实现迷宫问题递归就是方法自己调用自己,每次调用时传入不同的变量递归需要遵守的重要规则(1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)(2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量(3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.(4) 递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError)(5) 当一个方法执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当方原创 2020-10-17 17:15:06 · 342 阅读 · 2 评论 -
中缀表达式转后缀表达式与计算
中缀表达式转后缀表达式与计算1.创建两个栈,一个存储数字和后缀表达式s1,一个存储符号栈s22.存储流程(1)如果符号栈s2为空,直接存入符号。(2)如果不为空,当前符号优先级等于或者大于栈的符号,直接存入。(3)如果不为空,当前符号优先级雄小于栈的符号,先弹出一个符号栈顶的元素,再比较,然后再存入(4)如果遇到(直接存入。(5)如果遇到)把符号栈遇到(之前的符号全部弹出存进去s1,最后再弹出这个括号。具体实现如下://将中缀表达式转换为后缀表达式 public static Li原创 2020-10-14 14:34:13 · 100 阅读 · 0 评论 -
逆波兰表达式/中缀表达式
逆波兰表达式/中缀表达式1.先定义一个方法分割字符串每个数据,然后存到集合里面2.然后在新的方法中定义 一个栈来存储数据具体实现如下://字符串转换为list集合 public static List<String> getString(String str) { //方便为了测试,用空格隔开 String [] res=str.split(" "); //创建集合存储 List<String>原创 2020-10-08 13:36:47 · 227 阅读 · 0 评论 -
栈实现中缀表达式
栈实现中缀表达式1.创建两个栈,一个用来存储数字一个用来存储操作符号2.判断每一个字符是数字还是操作符3.如果是数字,直接存入数栈中4.如果是符号,看符号栈是否为空,如果为空直接存入5.如果符号栈不为空,从符号栈中取出一个数据与当前符号比较,如果当前操作符优先级高于栈取出的,直接存入,否则从数栈中弹出两个数据与当前符号进行运算,把得到的结果存入数栈中6.在判断两位数的时候,我们扫描的时候需要看看下一位是否也是数字,不能拿第一个数字的存入栈中,如果下一位不是数字直接存入,如果下一位是数字接着扫描直原创 2020-10-05 20:54:41 · 603 阅读 · 0 评论 -
括号匹配问题
括号匹配问题1.创建一个栈(stack)来存储左边的括号2.遍历字符串获取每一个字符看是否为左括号或者右括号,如果为左括号将他压入栈中,如果为右括号从栈中弹出一个左括号,如果都不是继续遍历3.判断t是否为null为null则没有对应的左括号4.遍历结束查看stack中是否还有左括号剩下,有则没有匹配否则匹配具体实现如下:public static boolean isMatch(String str) { //创建一个栈 Stack<String&g原创 2020-10-04 15:12:12 · 353 阅读 · 0 评论 -
数据结构之栈(基础实现)
栈栈是先进后出(FILO)的一种数据结构,跟队列相反1.数组实现栈定义一个数组模拟栈。maxsize表示最大的容量top指针指向原创 2020-10-04 12:06:59 · 202 阅读 · 0 评论 -
单链表、双链表和环形链表(相关知识点)
链表数据结构中有一种叫链表的,它不像数组有空间限制,可以无限(内存范围内)添加元素单链表的存储如下(1)链表是以结点来一个个存储的链式存储(2)他有两个域一个数据域用来存储数据,还有一个指针域用来存储下一个结点的存储的位置(3)链表有带有头节点的链表,也有不带头结点的链表 带头节点的单链表如下 核心代码如下public class原创 2020-09-13 16:31:26 · 344 阅读 · 0 评论