数据结构
文章平均质量分 69
又蠢又笨的懒羊羊程序猿
『世界上只有一种真正的英雄主义』
展开
-
Java实现前中后序线索化二叉树以及遍历
文章目录一、线索化二叉树的原理二、构建线索化二叉树三、代码实现线索二叉树一、线索化二叉树的原理在前面介绍二叉树的文章中提到,二叉树可以使用两种存储结构:顺序存储和链式存储,在使用链式存储时,会存在大量的空指针域,为了可以充分利用这些空指针域,引申出了线索化二叉树,将这些空指针域利用起来,提高检索效率。上图中,紫色区域就是没有指向的空指针域,从存储空间的角度来看,这些空指针域浪费了内存资源。从另外的角度思考,如果需要知道C节点的前驱节点和后继节点,每次都都需要进行一次遍历,是否可以提前存储C节点的前原创 2021-08-19 13:24:48 · 1365 阅读 · 4 评论 -
数据结构:二叉树
文章目录树前言1.树概念及结构1.1树的概念1.2树的实现2.二叉树2.1概念2.2二叉树的存储结构2.3特殊的二叉树2.4二叉树的存储结构2.4.1顺序存储2.4.2链式存储3.二叉树顺序结构及其实现3.2二叉树的顺序结构3.1代码实现4.二叉树链式结构及实现4.1二叉树链式结构的遍历4.2代码实现树前言为什么需要树这种数据结构?1、数组存储方式分析优点:通过下表方式访问元素,速度快,对于有序数组,还可以使用二分、插入以及斐波那契查找算法来提高检索效率。缺点:如果要检索具体的某个值,或者原创 2021-08-18 21:43:21 · 214 阅读 · 3 评论 -
Java实现HashTable的基本操作
文章目录哈希表前言实现思路代码实现哈希表前言哈希表(Hash Table)也叫做散列表,是根据键值对(Key Value)而直接访问的数据结构。它通过将关键码值Key映射到表的一个位置来直接访问,以此加快查找的速度。这个映射函数叫做散列函数,存放记录的数值叫做散列表。实现思路哈希表底层通过数组和链表组成,数组中的每一个值就是链表。HashMap就是用哈希表实现,当我们使用put(key,value)方法时,哈希表中调用key.hashCode()%size,计算得出的值就是数组的下标,因不同k原创 2021-08-15 10:48:33 · 1058 阅读 · 3 评论 -
数据结构:栈实现逆波兰计算器
栈实现逆波兰计算器前言上篇博文中已经介绍了栈实现中缀表达式计算器,中缀表达式形如 “1+((2+3)*4)-5” 对人比较容易计算,但对于计算机却是一件比较困难的事,而后缀表达式 "1 2 3 + 4 * + 5 -"恰恰相反,对人计算起来不是很方便,但对于计算机比较方便并且高效,因此本博文将讲解如何将中缀表达式转换为后缀表达式和实现后缀表达式的计算。1.中缀表达式转换为后缀表达式1.1思路初始化两个栈:运算符栈s1和储存中间结果的栈s2从左至右扫描中缀表达式扫描到数字时,将其入栈s2扫原创 2021-08-11 01:00:53 · 245 阅读 · 1 评论 -
数据结构:栈实现简易计算器
文章目录栈实现简易计算器思路代码实现栈结构运算方法测试栈实现简易计算器之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便。本博文中将介绍如何用栈实现一个可以进行简单四则运算不含括号的简易计算器(中缀表达式)思路首先创建两个栈,一个用于存储数而另一个用于存储运算符号。首先需要一个index索引来遍历表达式遍历到数字时直接入数栈遍历到运算符时需要分情况讨论如果当前符号栈为空直接入栈如果当前符号栈不为空需要分情况讨论当前遍历到的运算符的运算优先级小原创 2021-08-07 21:53:53 · 6522 阅读 · 2 评论 -
数据结构:栈
文章目录栈1.定义:2.用数组模拟栈2.1思路2.2代码实现3.用链表模拟栈3.1思路3.2代码实现栈1.定义:栈是一个先入后出(FILO-First In Last Out)的有序列表栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端为变化的一端,称之为栈顶,另一端为固定的一端,称之为栈底。根据栈的定义可知,最后放入栈中的元素在栈底,最后放入的在栈顶。而删除元素恰好相反,最后放入的元素最先删除,最先放入的元素最后删除。2.用数组模原创 2021-08-05 23:50:21 · 120 阅读 · 2 评论 -
数据结构:循环链表解决约瑟夫问题
约瑟夫问题问题来历据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着原创 2021-08-05 13:26:18 · 490 阅读 · 2 评论 -
数据结构:双向链表
文章目录双向链表1.定义1.1双向链表定义:1.2单链表特点:1.3双链表特点:2.代码实现2.1双向链表的节点结构:2.2插入节点2.3删除节点2.4修改节点2.5遍历链表双向链表上篇博客已将讲解过单向链表,单向链表在实现增删改查时速度还是有所限制,可以通过双向链表更快地实现操作。1.定义1.1双向链表定义: 双向链表也是链表的一种,每个数据节点中都有两个指针,一个为pre指向前一个节点(前驱),另一个为next指向下一个节点(后继),因为这个特点,双向链表可以很方便的访问任意节点的前驱节点原创 2021-08-04 15:20:57 · 543 阅读 · 2 评论 -
数据结构:单向链表的反转
文章目录单链表的反转1.头插法1.1思路1.2代码实现2.就地逆置法2.1思路2.2代码实现单链表的反转本文主要介绍头插法逆置和就地逆置法实现链表的反转1.头插法1.1思路迭代方式的链表反转操作核心是从链表头到链表尾首先让创建一个temp指针使其指向头节点的下一个节点,并将其取出取出之后让新创建的reverseNode节点指向刚取出的节点,反复进行上述操作。需要注意的是每次取出节点之前,需要用另外一个指针暂存temp指向的节点的下一个节点,防止temp指针变化后找不到新的节点。最后让初原创 2021-08-03 13:29:17 · 995 阅读 · 2 评论 -
数据结构:单向链表
单链表文章目录单链表前言单向链表的结构代码实现链表存储的节点链表初始化链表的基本操作增加节点按照编号顺序添加节点更新节点中数据遍历链表获取链表长度获取倒数第n个节点前言在链表的学习之前,我们已经学过了数组,在数组创建时,其数组长度已经写死了,因此对于数据的拓展,数组具有一定的局限性。数组有一个很重要的结构就是索引,我们在数组中查询数据也是用索引去查询,因此当需要删除数据时,必须将所有数据进行移动改变索引,性能开销相当大,而链表就可以解决以上问题。单向链表的结构[外链图片转存失败,源站可能有防盗链原创 2021-08-02 22:38:53 · 99 阅读 · 0 评论 -
数据结构:队列
1.队列1.1定义队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列(Queue)是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端叫做队尾,删除的一端叫做队头。1.2队列顺序存储的约定及说明front变量指向队头元素的前一个位置rear变量指向队尾的数据空队时,rear == front队列初始时,rear = front = 0入队:队列未满时,将数据送至队尾,rear指针加一出队:队列不为空时,将原创 2021-08-01 17:24:15 · 298 阅读 · 1 评论 -
数据结构:稀疏数组
稀疏数组1.定义稀疏数组相当于普通数组的压缩,当一个数组中大部分元素为0或者为同一个值的数组时,可以用稀疏数组来保存该数组。例如:原始数组:0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0原创 2021-07-31 18:04:53 · 102 阅读 · 1 评论