数据结构
Alyson_jm
这个作者很懒,什么都没留下…
展开
-
用栈实现中缀表达式转后缀表达式
转换规则:相同等级的运算符,栈外高于栈内。栈外的左括号优先级最高。栈内的左括号优先级最低。栈外的右括号优先级最低。低到和栈内的左括号优先级一样。1.写一个类用来存储优先级,数字越小优先级越高。public class Constant { public static final int OPERATORS_PRIO_PLUS_IN = 4; //栈内加法 public static fina...原创 2018-05-08 16:00:38 · 865 阅读 · 0 评论 -
Java 数据结构——链式栈
1 . 链式栈的定义。链式栈的定义和单链表的定义一样。入栈采用单链表的头插法,出栈依然从第一个节点开始删除,刚好实现了栈先进后出的特点,链式栈不用判断栈空和栈满。class LinkStack{ class Entry{ int data; Entry next; public Entry(){ this.data = -1; this.next = null; }...原创 2018-05-08 16:26:51 · 349 阅读 · 0 评论 -
用两个栈实现一个队列
用两个栈实现一个队列1 . 一个栈用来做存储空间,一个用来做缓冲空间。 Stack s1 = new Stack();//作为存储空间 Stack s2 = new Stack();//作为缓冲空间2.队列的基本操作。a .判断队列是否为满:也就是判断栈 s1 是否为满。 public boolean isFull(){ return s1.isFull(); } b...原创 2018-05-08 16:58:21 · 236 阅读 · 0 评论 -
java 数据结构——循环队列、链式队列、优先级队列
java 实现循环队列 1 . 数组 elem 存储队列元素。front 和 rear 分别表示对头和对尾。usedSize表示存储的有效位的个数。allSize表示数组的长度。数组仅存储 allSize - 1 个元素,还有一个空间被浪费。循环队列不能用rear = rear + 1指向下一个元素,会发生越界,而要用this.rear = (this.rear+1) % this.allSiz...原创 2018-05-08 17:51:38 · 452 阅读 · 0 评论 -
线性表——顺序存储、链式存储
线性表概述概念:零个或多个数据元素的有限序列数据是有限的 第一个元素无前驱,最后一个元素无后继 是有数据序的,每个数据在线性表中都有一个固定的位置 在较复杂的线性表中,数据元素可以由若干个数据项组成星座列表就是一个线性表,白羊座是第一个元素,没有前驱,双鱼座是最后一个元素,没有后继,每个元素都在固定的位置,它们是有序的。线性表的基本操作initList(list L)...原创 2018-08-21 00:27:04 · 701 阅读 · 0 评论 -
线性表——循环链表
循环链表的简介循环链表本质上和单链表并没有什么不同,准确的说循环链表就是特殊的单链表。单链表:除了头结点和尾结点每个节点都有且仅有一个前驱和后继。循环链表:每一个结点都有且仅有一个前驱和后继。 循环链表的特点不管从任一节点开始,都能遍历整个链表循环链表的基本操作1.创建循环链表从图中我们可以看到循环链表的尾节点直接指向了头结点,所以创建循环链表遵循此规律即可...原创 2018-09-22 13:23:59 · 943 阅读 · 0 评论 -
线性表——双向链表
双向链表简介双向链表是一种特殊的链表。在单向链表中我们要查找下一个结点非常的方便,但是要查找上一个节点就困难了,双向链表克服了单链表的单向性这个缺点,单链表和双向链表的区别单链表:只能向一个方向遍历双向链表:向两边都可以遍历。双向链表的实现为了找到节点和前驱,我们给节点增加一个指向其前驱的指针,如下图所示既然单链表可以循环,那么双向链表也就可以循环,如下图所示即...原创 2018-09-22 13:23:37 · 701 阅读 · 0 评论 -
经典排序算法——快速排序及其优化
快速排序快速排序的思想:通过一趟排序将数据分割成独立的两部分,其中一部分数据都比另一部分的所有数据都要小,然后再按照此方法对这两部分数据分别进行快速排序,可以递归的进行。时间复杂度:好的情况(无序的):O(nlog2n) 坏的情况(有序的):O(n^2)快速排序法不稳定。让我们先通过一个例子来了解一下:12 5 4 25 10 15...原创 2018-05-14 00:37:47 · 2260 阅读 · 0 评论 -
经典排序算法——希尔(Shell)排序
Shell(希尔)排序希尔排序(Shell Sort)是插入排序的一种,是对直接插入法排序的一种改进。插入排序请参考我的另一篇博文:经典排序算法—直接插入法排序希尔排序是按照分治法的思想,将原来的元素分成几个组,在组内采用直接插入法进行排序。时间复杂度:O(n^1.3~2.5) 不稳定如:6 9 2 7 5 3按照关键字进行分组:我们选取3 和 1 。首先按照关键字 3...原创 2018-05-13 23:15:59 · 821 阅读 · 0 评论 -
java 数据结构——java实现顺序表、单链表
线性表示数据结构的一种,它是 n 个具有相同特性的 数据元素的有限序列。顺序表顺序表指的是用一组地址连续的存储单元存储线性表中的数据元素,称为线性表的顺序存储结构或者顺序映像。线性表采用顺序存储的方式存储就称之为顺序表。一 . 顺序表的建立。class TestSqlist{ int usedSize;//当前有效的数据元素的个数。 int[] elem;//用一组地址连续...原创 2018-05-13 17:05:22 · 1223 阅读 · 0 评论 -
用两个队列实现一个栈
用两个队列实现一个栈1.入栈入队的时候看哪个栈队列不为空则给哪个入队。public static void enterStack(QueueLink q1,QueueLink q2,int val){QueueLink p = null;if(!q1.isEmpty()){p = q1;}else{ p = q2;} ...原创 2018-05-11 09:38:06 · 357 阅读 · 0 评论 -
经典排序算法——堆排序
堆排序这里的堆指的是完全二叉树。我们先来了解一下最大堆。最大堆就是二叉树中所有的父节点都大于子节点。如图,下图就是一个堆。下面我先来简单介绍一下堆排序的过程。构造一个最大堆。将最大的值拿出来。剩下的元素继续构造一个最大堆。堆排序的关键就在于构造最大堆。下面我们来详细的介绍一下最大堆的求法。首先我们找到最后一个元素的父节点,比较它和他两个孩子节点,找到最大值赋给它。依次对前面的节点进行相同的操作。下...原创 2018-05-17 19:17:49 · 261 阅读 · 0 评论 -
java 数据结构——字符串匹配算法
1.用java实现 BF 算法BF算法又称为暴力算法,它的核心思想是:从下标为 0 处比较主串和子串,若相等,则依次向下比较,直到子串结束,则得到匹配结果,若不相等,则主串回溯到下标为 1 处和子串下标为 0 处比较,依次类推,直到得到结果。优点:比较容易理解,没有对主串和子串进行多余的处理。缺点:每次每次字符不匹配时,都要回溯到开始位置,时间开销大。大家可以按照下面的图来理解比较容易一些。下面用...原创 2018-05-12 00:24:26 · 2351 阅读 · 0 评论 -
经典排序算法——归并排序
归并排序归并合并简单来说就是先将数组分成组,然后再将组有序的合并起来。我们可以拿一个例子来分析一下。1 3 5 2 7 4 0我们将上面的数组分成两两一组(剩下不够一组的则单独分成一组)。【1 3】【5 2】【7 4】【0】拿出两个组来进行有序的合并。【1 3】【5 2】合并为【1 2 3 5】【4 7】【0】合并为【0 4 7】所以现在得到的是1 2 3 ...原创 2018-05-18 23:57:29 · 249 阅读 · 0 评论 -
经典排序算法——基数排序法
基数排序法奇数排序法比较简单,只不过我们需要设置十个桶来分别暂时存储元素现在我们用一个例子简单的了解一下。1.比较个位数字,分别将它们放到对应号码的桶里。然后分别取出来(从桶底取出来)。2.比较十位数字,分别将它们放到对应号码的桶里。然后分别取出来(从桶底取出来)。2.比较百位数字,分别将它们放到对应号码的桶里。然后分别取出来(从桶底取出来)。这个过程下来就是排好序的数组啦。...原创 2018-05-19 00:28:04 · 1630 阅读 · 1 评论 -
经典排序算法——直接插入排序算法
直接插入排序每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数...原创 2018-05-19 10:35:42 · 644 阅读 · 0 评论 -
经典排序算法——选择排序
选择排序第1趟,在待排序记录array[0]~array[array.lenght-1]中选出最小的记录,将它与array[0]交换;第2趟,在待排序记录array[1]~array[array.lenght-1]中选出最小的记录,将它与array[1]交换;以此类推,第i趟在待排序记录array[i]~array[array.lenght-1]中选出最小的记录,将它与array[i]交换,使有序...原创 2018-05-19 10:49:21 · 305 阅读 · 0 评论 -
经典排序算法——冒泡法排序
一、冒泡法排序冒泡法排序就是每次两两比较,小的数字放前面,大的放后面,一趟下来最大的数就在数组的最后了。接着将剩下的数字继续采用冒泡法。冒泡法的核心就是两两比较。这只是一趟的排序,后面每一趟的排序都会将最大的数放到数组的后面,直到数组有序。我们用 java 来实现一下这个算法 public static void bubblesort(int[] array){ ...原创 2018-05-19 11:13:16 · 1005 阅读 · 0 评论 -
红黑树
红黑树的定义每个节点都是有颜色的,不是红色就是黑色root 必须是黑色的所有叶子节点都是黑色的,叶子节点是NULL 节点,不存储实际的数据每个红色的节点必须有两个黑色的子节点(从每个叶子节点到根节点的所有路径上不能有连续的红色节点)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点预备知识当进行插入或者删除时,红黑树的条件有可能被破坏,这就需要我们进行调整。调整可以分...原创 2019-05-06 15:09:51 · 168 阅读 · 0 评论