数据结构与算法设计
文章平均质量分 53
深入理解数据结构,并熟练掌握相关算法,提升代码质量,打开一线大厂之门
eligible-zzw
这个作者很懒,什么都没留下…
展开
-
三十七、Prim算法--求解最小生成树
一、Prim算法介绍普利姆(Prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶点的 连通子图,也就是所谓的极小连通子图普利姆的算法如下:设 G=(V,E)是连通网,T=(U,D)是最小生成树,V,U 是顶点集合,E,D 是边的集合若从顶点 u 开始构造最小生成树,则从集合 V 中取出顶点 u 放入集合 U 中,标记顶点 v 的 visited[u]=1若集合 U 中顶点 ui 与集合 V-U 中的顶点 vj 之间存在边,则寻找这些边原创 2021-04-24 20:59:31 · 216 阅读 · 0 评论 -
三十六、贪心算法--集合覆盖问题
一、贪心算法介绍1.贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解2.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择二、算法思路1.贪心算法一般按照如下步骤进行:建立数学模型来描述问题把求解的问题分成若干个子问题对每个子问题求解,得到子问题的局部最优解把子问题的解局部最优解合成原来解问题的一个解结论:贪心算法是一种对某些求最优解问题的更简单、更迅速的设计原创 2021-04-24 15:45:15 · 1868 阅读 · 0 评论 -
三十五、字符串匹配问题--KMP算法
一、字符串匹配问题的应用场景有一个字符串 str1= ““硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好””,和一个子串 str2=“尚硅谷你尚硅 你”现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1二、暴力匹配算法如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有:如果当前字符匹配成功(即 str1[i] == str2[j]),则 i++,j++,继续匹配下一个字符如果失原创 2021-04-22 10:33:30 · 119 阅读 · 0 评论 -
三十四、动态规划解决01背包问题
一、动态规划算法介绍动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步一步获取最优解的处理算法。动态规划算法与分治算法类似,其基本思想是将待求解的问题分解成若干个子问题,先求子问题,然后从这些子问题的解得到原问题的解。与分治算法不同的是,适合用于动态规划求解的问题,经分解得到子问题往往不是互相独立的。即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解。动态规划可以通过填表的方式来逐步推进,得到最优解。二、动态规划的最佳实践–背包问题三、背包原创 2021-04-19 09:17:22 · 229 阅读 · 0 评论 -
三十三、分治算法---汉诺塔问题
一、分治算法的介绍分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或 相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题 的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变 换)……分治算法可以求解的一些经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔原创 2021-04-16 16:48:07 · 166 阅读 · 0 评论 -
三十二、图的创建&&深度优先遍历(DFS)&&广度优先遍历(BFS)
一、图的基本介绍为什么要有图前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图。图的举例说明:图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为 顶点。二、图的表示方法图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。邻接矩阵:邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于 n 个顶点的图而言,矩阵是的原创 2021-03-04 22:48:35 · 249 阅读 · 1 评论 -
三十一、二叉排序树的创建、删除和遍历
一、实际需求给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加解决方案一:使用数组数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢.数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位 置后,后面的数据需整体移动,速度慢解决方案二:使用链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。解决方案三:使用二叉排序树二、二叉排序树的介绍二叉排序树:BS原创 2021-03-03 15:54:26 · 127 阅读 · 1 评论 -
三十、赫夫曼树的设计与代码实现
一、基本介绍给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为 最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近二、赫夫曼树的重要概念路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1结点的权及原创 2021-03-02 21:03:31 · 118 阅读 · 0 评论 -
二十九、堆排序
一、堆排序的基本思想将待排序序列构造成一个大顶堆此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余 n-1 个元素重新构造成一个堆,这样会得到 n 个元素的次小值。如此反复执行,便能得到一个有序 序列了。在构建大顶堆的过程中,元素的个数在逐渐减少,左后得到一个有序序列二、堆排序步骤图解说明要求:给你一个数组 {4,6,8,5,9} , 要求使用堆排序法,将数组升序排序。步骤一 构造初始堆。将给定无序序列构造成一个大顶堆(一般升序原创 2021-03-02 17:40:23 · 243 阅读 · 0 评论 -
二十八、顺序存储二叉树
一、顺序存储二叉树的概念从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组, 示意图如下:要求:右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第 n 个元素的左子节点为 2 * n + 1第 n 个元素的右子节点为 2 * n + 2原创 2021-03-02 11:19:30 · 102 阅读 · 0 评论 -
二十七、二叉树--删除结点
一、删除规则如果删除的节点是叶子节点,则删除该节点如果删除的节点是非叶子节点,则删除该子树.注意到时候学习二叉排序树的时候删除非叶子结点就不是这样了二、删除结点思路分析三、代码实现package cn.zzw.algorithm.Tree;public class BinaryTreeDemo { public static void main(String[] args) { //想创建一棵二叉树 BinaryTree binary原创 2021-03-01 23:35:14 · 595 阅读 · 0 评论 -
二十六、二叉树--查找指定节点
一、通过前中后序遍历查找指定节点请编写前序查找,中序查找和后序查找的方法。并分别使用三种查找方式,查找 heroNO = 5 的节点并分析各种查找方式,分别比较了多少次思路分析图解二、代码实现package cn.zzw.algorithm.Tree;public class BinaryTreeDemo { public static void main(String[] args) { //想创建一棵二叉树 BinaryT原创 2021-03-01 22:23:47 · 341 阅读 · 0 评论 -
二十五、二叉树的前序、中序、后序遍历
一、为何使用树这种数据结构数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。 缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)树存储方式的分析 能提高数据存储,读取的效率, 比如利用 二叉排原创 2021-03-01 21:05:23 · 153 阅读 · 0 评论 -
二十四、哈希表的原理分析及代码实现
一、哈希表的基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表。二、哈希表的实际需求1.有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的 id 时, 要求查找到该员工的 所有信息.不使用数据库,速度越快越好=>哈希表(散列)添加时,保证按原创 2021-03-01 16:52:43 · 146 阅读 · 0 评论 -
二十三、斐波那契查找算法
一、基本介绍1.黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神 奇的数字,会带来意向不大的效果。2.斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值 0.618二、斐波那契(黄金分割法)原理斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置原创 2021-03-01 13:57:10 · 124 阅读 · 2 评论 -
二十二、插值查找算法
一、插值算法的介绍1)插值算法原理介绍插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。2)将折半查找中的求 mid 索引的公式 , low 表示左边索引 left, high 表示右边索引 right. key 就是要查找的值3)int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/对应前面的代码公式: int mid = left + (right – lef原创 2021-02-28 21:37:00 · 137 阅读 · 0 评论 -
二十一、二分查找算法(递归&&非递归)
一、二分查找思路分析1.首先确定该数组中间的下标 ,即mid=(left+high)/2;2.然后让需要查找的value值与array[mid]值进行比较2.1)findVal > arr[mid] ,说明你要查找值在mid的右边,因此需要向右递归进行查找。2.1)findVal < arr[mid] ,说明你要查找值在mid的左边,因此需要向左递归进行查找。2.3)findVal == arr[mid]说明找到,就返回二、二分查找递归的退出条件1.找到就结束递归2.递归完整个数原创 2021-02-28 19:07:23 · 200 阅读 · 0 评论 -
二十、线性查找算法
一、Java中常见的查找算法顺序(线性)查找二分查找/折半查找插值查找斐波那契查找二、线性查找算法package cn.zzw.algorithm.search;//线性查找算法public class SeqSearch { public static void main(String[] args) { int[] array={1,88,645,90,4,-6,8}; int index=seqSearch(array,-原创 2021-02-28 17:19:40 · 92 阅读 · 0 评论 -
十九、基数排序
一、基数排序介绍(是典型的空间换时间算法)注意:个人认为基数排序代码是这些排序算法中最不好理解的,希望读者能好好体会基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾 名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(Radix Sort)是桶排序的扩展基数排序是 1887原创 2021-02-10 23:01:53 · 107 阅读 · 0 评论 -
十八、归并排序
一、归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。二、归并排序思想示意图1—基本思想三、归并排序思想示意图2—合并相邻有序子序列再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将 [4,5,7,8]和[1,2,3,6原创 2021-02-10 19:23:15 · 95 阅读 · 0 评论 -
十七、快速排序
一、快速排序法的介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两 部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。二、快速排序示意图三、快速排序的应用实例要求: 对 [-9,78,0,23,-567,70] 进行从小到大的排序,要求使用快速排序法。如果取消左右递归,结果是 -9 -567 0 23 78 70如果原创 2021-02-10 15:38:17 · 179 阅读 · 2 评论 -
十六、希尔排序即其优化(交换法--->移动法)
一、为何要引入希尔排序首先先看直接插入排序所存在的弊端,数组 arr = {2,3,4,5,6,1},如果要插入的数1(最小),这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响二、希尔排序的介绍希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简原创 2021-02-10 11:01:25 · 184 阅读 · 0 评论 -
十五、插入排序算法(两种方式)
一、插入排序法思想插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排 序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。二、插入排序思路图三、插入排序算法第一种解法package cn.zzw.algorithm.sort1;import java.util.Arrays;publ原创 2021-02-09 19:36:53 · 303 阅读 · 2 评论 -
十四、选择排序算法
一、选择排序算法思想选择排序(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[i-1]交换,…, 第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值, 与 arr[原创 2021-02-09 17:54:15 · 82 阅读 · 1 评论 -
十三、冒泡排序算法及其优化
一、基本介绍**冒泡排序(Bubble Sorting)的基本思想是:**通过对待排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。二、优化前的代码package cn.zzw.algorithm.sort1;import java.util.Arrays;public class BubbleSort { public static void main(String[] args) {原创 2021-02-08 22:22:28 · 111 阅读 · 0 评论 -
十二、八皇后问题(递归回溯)
一、八皇后问题介绍(本次使用回溯算法解决,之后会用贪心算法优化)在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、 同一列或同一斜线上,问有多少种摆法(92)。二、八皇后问题算法思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否 和前面已经放置好的皇后冲突, 如果冲突,继续放在第二列、第三列、依次把所有列都 放完,找到一个合适继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,算是找到了一原创 2021-02-07 20:55:37 · 460 阅读 · 0 评论 -
十一、递归----迷宫问题
一、递归的概念1.递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时 可以让代码变得简洁。二、递归调用机制三、递归可以解决的问题1.各种数学问题如: 8 皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google 编程大赛)2.各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.3).将用栈解决的问题–>使用递归代码比较简洁四、递归需要遵守的重要规则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)原创 2021-02-06 22:45:08 · 225 阅读 · 0 评论 -
十、分享一道LeetCode较为简单的单链表题,但是却能激发起练习算法的极大的兴趣
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值1.今天在LeetCode练习一道单链表的题(题目如上),虽然不难,但是却极大的触动了我学习算法的兴趣。因为当你看到大神的解法时,你真的是一种兴奋的拍桌子的感觉,不禁反思为什么人家可以想到这么优秀的解法。当然希望那些和我一样的算法小白在看到这篇博客时,也能有一种好好学习算法的冲动。下面将我写的算法,与大神的算法做对比。2.我的算法思想是:首先遍历一次单链表,得到该但单链表的长度length,之后再利用一个循环遍历到length-k处,这样就得原创 2021-01-30 22:04:14 · 47 阅读 · 0 评论 -
九、中缀表达式转为后缀表达式
使用栈将中缀表达式转为后缀表达式并计算一、中缀表达式转换为后缀表达式由于后缀表达式适合计算式进行计算,但是人对于较长的中缀表达式,很难将中缀表达式直接转换为后缀表达式,于是我们使用栈来实现中缀表达式转成后缀表达式。二、 中缀表达式转后缀表达式的分析步骤1.初始化两个栈:运算符栈S1和存储中间结果的栈S22.从左到右扫描中缀表达式3.遇到操作数时,将其压入S2中4.遇到运算符时,比较其与S1栈顶符号的优先级4.1)如果S1为空或者栈顶运算符为“(”,则直接将此运算符压入栈中4.2)否则,若优原创 2021-01-25 18:05:01 · 391 阅读 · 0 评论 -
八、逆波兰计算器的分析与实现
逆波兰计算器的分析与实现一、案例1.输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果2.例如: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值步骤如下:1)从左到右扫描表达式,将3和4压入栈中2)遇到+运算符,因此弹出3和4(4位栈顶元素,3为次顶元素),计算出3+4的值,得到7,再将7压入栈中3)往后继续遍历,遇到5,将5入栈4)接下来是x运算符,因此弹出5和7,计算出7x5=35,并将结果35入栈5)将6入栈6)最后是原创 2021-01-22 22:32:19 · 106 阅读 · 0 评论 -
七、使用栈实现综合计算器(中缀表达式)
使用栈实现综合计算器(中缀表达式)1.栈的实际需求请输入一个表达式,计算式:[722-5+1-5+3-3] ,计算出结果计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看这个算式 7 * 2 * 2 - 5, 但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。-> 栈2.使用栈实现表达式计算的大致思路(详细思路见代码)(1)创建一个临时变量index索引,来遍历表达式;并创建两个栈空间,一个数栈,一个符号栈。(2)从前往后原创 2021-01-20 23:08:13 · 190 阅读 · 0 评论 -
六、使用数组模拟栈的思路及代码实现
使用数组模拟栈的实现过程1.栈的介绍(1) 栈的英文为(stack)(2) 栈是一个先入后出(FILO-First In Last Out)的有序列表。(3) 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的 一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。(4) 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元 素最先删除,最先放入的元素最后删除(5)原创 2021-01-20 18:32:09 · 146 阅读 · 0 评论 -
五、单向环形链表---实现约瑟夫(Josephu)问题
使用单向环形链表实现约瑟夫(Josephu)问题1.约瑟夫(Josephu)问题描述Josephu 问题为:设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此 产生一个出队编号的序列。2.小提示用一个不带头结点的循环链表来处理 Josephu 问题:先构成一个有 n 个结点的单循环链表,然后由 k 结点起从 1 开 始计数,原创 2021-01-19 19:20:48 · 386 阅读 · 0 评论 -
四、双向链表的操作分析和代码实现
双向链表1.双线链表的定义和引入引入:单链表的缺点:(1)单向链表查找的方向只能是一个方向,而双向链表可以双向查找(2)单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除综上我们可以引入双向链表**定义:**双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。2.双向链表增删改查的核心操作分析注意:在执行添加和删除操作时要判断当前结点是否为最后一个结点(原创 2021-01-15 19:33:48 · 129 阅读 · 1 评论 -
三、单链表增删改查原理和代码实现
单链表1.简单介绍(1)单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。(2)链表的各个节点不一定是连续存储(3)链表分为带头结点的链表和不带头结点的链表,在实际中根据需求来确定2.单链表的应用实例使用带 head 头的单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增删改查操作注:在执行添加操作时原创 2021-01-14 17:39:57 · 384 阅读 · 0 评论 -
一、稀疏数组的实际应用和代码实现
稀疏数组1.实际需求使用二维数组记录棋盘2.分析问题因为二维数组中的很多值都是默认值0,因此记录了很多没有意义的数据,由此我们引出稀疏数组3.稀疏数组的基本介绍(1)当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。(2)稀疏数组的处理方法是:记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模4.稀疏数组举例说明5.二维数组转换成稀疏数组的思路1.遍历整个二维数组得到有效数据的个数为su原创 2021-01-12 16:46:02 · 124 阅读 · 0 评论 -
二、数组模拟环形队列思路及代码实现
队列总:我首先会介绍数组模拟队列思路及代码实现,并分析其弊端;之后将代码进行优化,将其转换为数组模拟环形队列。1.队列介绍(1)队列是一个有序列表,可以使用数组或者链表来实现(2)遵循先入先出的原则:即先存入队列的数据会先被取出,后被存入的数据后被取出。2.数组模拟队列思路(1)队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的申明如下图,其中maxSize是该队列的最大容量(2)因为队列的输入输出是从前后端来处理,因此需要两个变量front和rear分别记录队列前后端的下标,原创 2021-01-13 18:48:33 · 191 阅读 · 0 评论