
数据结构
文章平均质量分 54
小橙子Wu
前端开发工程师,热爱运动,期待代码水平越来越好。
展开
-
【Java版数据结构】你还不会二叉树吗?本篇文章教会诸位二叉树的设计与实现
二叉树的类型:二叉树:至多有2个分支的结点组成的树叫做二叉树满二叉树:当其中所有结点的分支均为2时就是满二叉树;完全二叉树:当这棵树除了最底层外,剩下的部分全是满的,并且最底层的结点全集中在该层最左边的位置,那么这样的树可称为完全二叉树。二叉搜索树:当某一结点的左子树全部小于当前结点,且右子树全部大于当前结点,这样的树叫做二叉搜索树二叉搜索树的API往树里面添加元素从树中获取结点删除树中某一结点测试往树里面添加元素步骤:用了两个重载的put方法实现,第一个put方法用于根节点的初始化.原创 2022-01-21 17:09:28 · 455 阅读 · 0 评论 -
【java版数据结构】链式队列的设计与实现
队列是一种特殊的数据结构,就像在食堂排队打饭一般,它具有先进先出的特点,队列可用数组或者链表实现,这里我们选择用链表实现对列,由于java具有面向对象的特点,我们通过创建一个Queue的类来秒速队列,在Queue类内部创建一个Node类来描述队列存储的每一个结点。队列的成员变量和方法成员变量方法Node head 头结点Queue()构造方法int N 队列元素个数isEmpty()判断队列是否是空的Node class{}内部结点类size()返回队列元素个数.原创 2022-01-14 13:25:55 · 313 阅读 · 0 评论 -
【java版数据结构】求后缀表达式,逆波兰表达式的值
介绍:后缀表达式又称逆波兰表达式,是一种操作符总是位于其两操作数之后的表达式,一般数学中的表达式叫做中缀表达式,操作符处于两操作数中间,例如4+2,42,4-2,4/2,而它们转换成后缀表达式是42+,42,42-,42/。后缀表达式实现原理:遍历表达式,如果当前字符串是数字,则入栈,如果当前字符串是运算符,则从栈中取出两个元素进行相应的运算,最后将运算结果入栈,方便下一个的运算,最终栈中仅剩的一个元素就是后缀表达式最后的结果。public class ReversePolishNotation .原创 2022-01-14 13:08:11 · 279 阅读 · 0 评论 -
【Java版数据结构】括号匹配问题
括号匹配:简而言之是每一个右括号都有唯一的左括号与其对应。例如(上海(北京)(深圳)杭州)括号是匹配的,而上海(北京)(深圳)杭州)(上海(北京)(深圳)杭州((上海(北京)(深圳)杭州)是不匹配的。判断原理:当遇到左括号时就把左括号进栈,遇到右括号时就出栈,因为最后进栈的一个左括号,一定会与第一个出现的右括号配对步骤:1.遍历带括号字符串的每一个字符2.如果字符是左括号,则进栈,遍历下一个字符3.继续判断字符,如果是右括号则出栈4.判断出栈的内容是否为空,如果是,则证明没有配.原创 2022-01-11 21:25:24 · 1493 阅读 · 0 评论 -
【java版数据结构】链式栈的设计与实现
栈是一种用于存放数据的线性结构,具有先进后出,后进先出的特点(就像子弹上膛一般,压到弹匣最上部的子弹总会最先发射出去)一般栈可用数组或者链表实现,这里介绍的是用链表实现栈由于java具有面向对象的特点,我们通过创建一个类Stack来描述栈,并且通过创建内部类Node实现结点栈的成员及方法栈的结点类:判断栈是否是空的:返回栈的长度:遍历栈进栈:出栈:栈的结点类://内部结点类 private class Node{ private T item; priv.原创 2022-01-11 21:03:55 · 547 阅读 · 0 评论 -
【java版数据结构】死亡游戏约瑟夫避免自杀问题
介绍:有一天罗马人占领了犹太人的领地,39个犹太人与约瑟夫以及他的朋友躲到一个山洞中,39个犹太人决定宁愿死也不要被罗马人招降,于是它们决定了一个自杀方式,41个人排成一个圆圈,第一个人从1开始报数,依次往后,如果有人报到3,那么这个人就必须自杀,然后由他的下一个人重新从1开始报数,直到所有人都自杀身亡。然而约瑟夫和他的朋友并不想遵从,于是约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16与第31个位置,从而逃过 了这场死亡游戏。问题转换: 41个人围坐一圈,第一个人编号为1,第二个人编号为.原创 2022-01-09 18:46:58 · 2868 阅读 · 1 评论 -
【java版数据结构】找到环形链表的入口
原理:我们先判断当前链表是否是环形链表,定位到快慢指针相遇的结点,这是创建一个temp指针指向第一个元素,用temp指针和慢指针继续遍历链表,temp指针和慢指针相遇的结点就是环形链表的入口数学分析:为什么在快慢指针相遇之后,用temp指针和慢指针去遍历链表时,相遇的结点就是环形链表的入口呢? //找出循环链表的入口 public static Node getEntrance(Node first){ //判断链表是否有环 //定义两个快慢指针 .原创 2022-01-09 16:15:24 · 796 阅读 · 1 评论 -
【java版数据结构】判断单链表是否有环
环形链表原理:前文介绍了快慢指针的应用,同时我们也可以通过快慢指针来判断当前链表是否有环(快慢指针是否相遇)。假如把链表比作一条跑道,链表中有环,那么这条跑道就是一条环形跑道,两个速度不一样的人在上面奔跑,那么这两个人迟早会相遇。第一步:定义两个快慢指针第二步:快指针的步长是2,慢指针的步长是1第三步:用这两个指针去遍历链表第四步:判断快慢指针在遍历过程中有没有相遇,若相遇,则说明是环形链表,未相遇,则说明是普通的单向链表注意的点:判断两指针是否相遇时,不应该使用fast.item.equa.原创 2022-01-09 15:45:04 · 832 阅读 · 0 评论 -
【java版数据结构】快慢指针找单链表中间值
链表不像顺序结构的数组那般可通过指定的下标访问中间值,我们通过指定一个快指针(步长为2,指针每次往下移动两位),一个慢指针(步长为1,指针每次往下移动一位),当快指针遍历完整个链表时,慢指针刚好指向链表的中间元素,以此原理,我们也能找到链表中的其他结点。原理:这就类似时间相同,速度和路程成正比,快指针的速度是慢指针的两倍,当快指针走完全程(单位1)时,慢指针刚好走到全程的1/2图片描述:为了防止空指针异常,以及当链表个数是偶数,该方法也适用,我们在遍历快指针时加上了一个安全验证,快指针本身不为.原创 2022-01-07 23:20:13 · 883 阅读 · 1 评论 -
【java数据结构】双链表的设计与实现
双链表介绍:双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用于存放数据,其中一个指针域用来指向后继结点,另一个指针域用来指向前驱结点。链表的头结点的数据域不存放数据,指向前驱结点的指针域值为null,指向后继结点的指针域指向第一个真正存储数据的结点。按照面向对象的思想,我们需要设计一个类来实现双向链表,由于结点是属于链表的,所以我们把结点类作为链表类的一个内部类来实现目录双链表的四个成员变量结点类的实现双向链表的构造方法在双链表尾部添加元素在指定.原创 2022-01-05 21:43:27 · 476 阅读 · 0 评论 -
【java版数据结构】单链表的设计与实现
介绍:链表是一种物理存储单元上非连续,非顺序的存储结构,其物理结构不能表示元素的逻辑顺序,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列的结点组成,并且每个结点在运行时动态生成。而单链表,顾名思义是单方向的链表,本文章实现的单链表包括一个头结点head,一个记录链表长度的N,以及若干个数据结点,数据结点由一个数据域ite,和一个指向下一个结点的指针域next组成。头结点是链表的入口,链表第一个存储的数据元素,我们规定下标为0;在java中,一切皆对象,所以我们单链表的实现也.原创 2022-01-05 21:04:41 · 394 阅读 · 0 评论 -
【java版数据结构】简单排序算法---------(2)选择排序
和冒泡排序一样,选择排序也是一种计算机领域比较简单的排序算法,主要由两个for循环实现,因此选择排序的时间复杂度也为O(n^2)选择排序原理一句话概括:找到最小的元素放到合适的位置1.假设未排序的第一个元素是最小元素,依次和剩余未排序的元素进行比较,如果存在比最小元素索引值更小的元素,则改变最小元素的索引值为更小元素的索引,以此找到最小元素所在的下标。2.把最小元素放到合适的位置,交换第一个元素和最小元素。选择过程:第一次:假设4是最小元素,4–>6,4比6小,不改变最小元素索引.原创 2021-12-28 10:50:38 · 136 阅读 · 0 评论 -
【java版数据结构】简单排序算法---------(1)冒泡排序
众所周知,排序是计算机学科的必经之路,学好排序能够提升算法的性能,而冒泡排序是计算机领域的一种较简单的排序算法,它由两个for循环组成,所以它的算法复杂度是O(n^2),在数据量较小时,效率还可以,但是当数据达到万以上时,效率明显底下。排序原理一句话概括:每次冒泡找到最大的元素放到合适的位置1. 两两比较相邻元素,如果前面的数比后面的数大,那么就交换两数的位置。2. 对每一对相邻的元素做同样的操作,从开始的第一对元素到最后一对元素,最终最后位置的元素就是最大值。冒泡过程:第一次冒泡:所有的.原创 2021-12-27 11:56:27 · 462 阅读 · 0 评论 -
【java版数据结构】看完数据结构的顺序结构后,紧接着去实现ArrayList的底层(150行代码,数组扩容,增删改查,但未实现迭代器)
实现效果:需求分析:可以看到ArrayList容器有很多功能,在指定位置添加元素,在容器末尾添加元素,获取指定位置的元素,获取容器的大小,清空容器的元素,判断容器是否是空的,删除指定位置的元素,删除某一元素等等现要求同学们把容器的主要功能用数组实现思维:我们都知道,数组是不可变的,一个数组在被创建的时候,其长度就已经固定住了,不能再改变,但是我们想要往数组里面不断的添加元素,实现ArrayList的效果,这时候我们可以用到数组扩容的思维,其主要思想是,新建一个比当前数组大的数组,将旧数组的原创 2021-11-13 17:41:19 · 619 阅读 · 1 评论