数据结构(Java实现)
小粥SAg
这个作者很懒,什么都没留下…
展开
-
数据结构(Java)之链表(7)-链表实现队列
队列我们知道是先进先出的数据结构,队首出队,队尾进队head节点方便我们在链表的头部进行删除和添加操作为了方便我们在链表的尾部进行操作,我们用tail节点来表示链表的尾部tail 节点也就是待添加元素之前的节点的位置,所以在tail处添加一个节点是非常容易的而如果要删除tail处的节点,需要找到tail节点之前的位置,需要从链首开始遍历结论:tail节点适合插入元素,不适合删除元素head节点方便插入,删除元素,所以我们从head端删除元素,从tail端插入元素由于没有dummyHead,原创 2020-06-20 21:06:34 · 119 阅读 · 0 评论 -
数据结构(Java)之链表(6)-链表实现栈
同数组实现栈,先定义一个接口Stackpublic interface Stack<E> { int getSize(); boolean isEmpty(); //向栈中添加元素 void push(E e); //从栈中取出元素 E pop(); //查看栈顶的元素 E peek();}在写接口实现类public class LinkedListStack<E> implements Stack<E原创 2020-06-20 20:21:06 · 68 阅读 · 0 评论 -
数据结构(Java)之链表(5)-删除功能
有如下一个链表删除索引为2位置的元素,也就是下图,元素2还是同前几节一样的思路,要找到被删除节点的前一个节点,所以需要一个prev找到2之前的元素,也就是1,prev指向元素1此时要进行的操作就是将prev节点的next指向被删除节点的下一个节点这里我们用delNode来表示被删除的节点,所以 prev.next = delNode.next为了能够回收,要将,delNode对应的节点的next置为null //删除在链表中index(从0开始计)个位置的元素,返回删除的元原创 2020-06-20 18:20:59 · 331 阅读 · 0 评论 -
数据结构(Java)之链表(4)-遍历,查询和修改
遍历功能:(获取某一位置的元素)//获得在链表中index(从0开始计)个位置的元素e //在链表中不是一个常用的操作,练习使用 public E get(int index){ //首先判断传入的index是否合法 if (index<0||index > size){ throw new IllegalArgumentException("传入的index不合法"); } Node cu原创 2020-06-20 17:39:15 · 216 阅读 · 0 评论 -
数据结构(Java)之链表(3)-链表的虚拟头结点
因为在向链表任意地方添加元素时,在链表的头添加元素和在其他位置添加元素逻辑上有差别(链表头没有之前的节点)为了统一逻辑,引入设立虚拟头结点的思想这个虚拟的头结点不存储任何元素,数据为null所以头节点所对应的元素为dummyHead的next没有引入虚拟头结点的实现:public class LinkedList <E>{ private class Node{ public E e;//存储数据 public Node next;//指向下原创 2020-06-20 16:55:20 · 344 阅读 · 1 评论 -
数据结构(Java)之链表(2)-链表的实现
先定义一个链表public class LinkedList <E>{ private class Node{ public E e;//存储数据 public Node next;//指向下一个节点的位置 public Node(E e,Node next){ this.e = e; this.next = next; } public Node(E e){原创 2020-06-20 16:29:37 · 176 阅读 · 0 评论 -
数据结构(Java)之链表(1)-链表的简单介绍
之前学习的动态数组,栈,队列的底层都是依托静态数组,靠resize解决固定容量的问题而链表是真正的动态数据结构且是最简单的动态数据结构链表涉及更深入的理解引用(指针)有递归结构功能性:辅助组成其他数据结构数据存储在"节点"(Node)中class Node{ E e;//存储真正的数据 Node next;//指向当前节点的下一个节点}结论:优点:链表是一个真正动态的数据结构,不需要处理固定容量的问题缺点:丧失了随机访问的能力(链表是靠 next进行连接,每一个节点所在的内存是不同原创 2020-06-20 15:19:11 · 90 阅读 · 0 评论 -
数据结构(Java)之队列(3)-循环队列的实现
首先还是定义一个接口类Queuepublic interface Queue<E> { int getSize(); //判空 boolean isEmpty(); //入队 void enqueue(E e); //出队 E dequeue(); //得到队首元素 E getFront();}接口实现类:public class LoopQueue<E> implements Queue<E&原创 2020-06-19 21:49:50 · 172 阅读 · 0 评论 -
数据结构(Java)之队列(2)-循环队列的思路
出队操作每个元素都要进行移动,时间复杂度为O(n)级别循环队列则能很好的解决这个问题我们用front 来指向队首的位置tail指向队尾的后一个位置(也就是下个入队元素应该待得位置)此时front == tail 表示队列为空若有元素入队,只需要维护tail向后移动一位(tail++)假设现在队列中有5个元素如果要出队一个元素,a出队,维护front++,指向此时队列中的第一个元素(队首)结论:入队维护rail 出队维护front当队列处于此图状态时,再有元素入队tail操作应该原创 2020-06-19 21:15:34 · 195 阅读 · 0 评论 -
数据结构(Java)之数组(1)-简单实用数组
概念:把数据码成一排进行存放索引:从0开始 最后一个n-1小技巧:在project中显示类中的方法小齿轮->Show Memberspublic class Main { public static void main(String[] args) { //第一种方式声明数组 int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { ar原创 2020-06-17 14:04:38 · 65 阅读 · 0 评论 -
数据结构(Java)之数组(2)-封装自己的数组并实现插入操作
使用数组的优点:快速查找数组应用场景:最好应用与"索引有语义"的情况(身份证号不能作为索引,要开辟很大空间)制作属于自己的数组类class Arraycapacity:容量-数组空间最多可以装多少元素size:数组中实际装多少元素 索引public class Array { private int[] data; private int size;//data数组中有多少个元素 // 数组的容量capacity = data.length pu原创 2020-06-17 15:14:46 · 253 阅读 · 0 评论 -
数据结构(Java)之数组(3)-查询数组元素和修改元素
重写toString()方法 @Override public String toString() { StringBuffer res = new StringBuffer(); res.append(String.format("Array:size = %d,capacity = %d\n",size,data.length)); res.append("["); for (int i = 0; i < size; i++原创 2020-06-17 21:45:46 · 109 阅读 · 0 评论 -
数据结构(Java)之数组(4)-包含,搜索和删除功能的实现
包含:查找数组中是否有元素e思路:①遍历数组中的元素②逐一判断是否有元素=e,若找到返回true③遍历结束还没找到,返回false//查找数组中是否有元素e public boolean contains(int e){ for (int i = 0; i < size; i++) { if (data[i] == e){ return true; } }原创 2020-06-17 22:28:51 · 186 阅读 · 0 评论 -
数据结构(Java)之数组(5)-使用泛型
使用泛型达到的效果:让我们的数据结构可以放置"任何"数据类型泛型里装的不能是基本数据类型,只能是类对象基本类型有:boolean,byte,char,short,int,long,float,double每个数据类型都有对应的包装类Boolean,Byte,Char,Short,Integer,Long,Float,Double所以我们可以使用数据类型的包装类改变int型数组的代码public class Array<E> { private E[] data;原创 2020-06-17 23:06:06 · 231 阅读 · 0 评论 -
数据结构(Java)之数组(6)-动态数组
静态数组的局限性:容量有限实现动态数组的思路:①开辟一个新的数组 newData②data中的元素放置newData中循环③data = newData(newData中转站)private void resize(int newCapacity) { E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i <size; i++) { newData[i] = dat原创 2020-06-17 23:27:36 · 100 阅读 · 0 评论 -
数据结构(Java)之数组(7)-时间复杂度分析
可能看过对时间复杂度的描述:O(1),O(n),O(lgn),O(nlogn),O(n^)大O描述的是算法的运行时间和输入数据之间的关系让我们来看个例子public static int sum(int[] nums){ int sum = 0; for (int num : nums) { sum += num; } return sum; }此时时间复杂度为O(n原创 2020-06-18 00:31:19 · 553 阅读 · 0 评论 -
数据结构(Java)之栈(1)-栈的简单介绍
栈也是一种线性结构相比数组,栈对应的操作是数组的子集只能从一段添加元素,也只能从一端取出元素这端称为栈顶总结:栈是一种后进先出的数据结构Last In First Out(LIFO)栈的应用:Undo操作:(撤销)程序调用的系统栈首先执行A函数执行到A函数第二行要执行B函数,暂时中断A函数,A函数存入栈中执行到B函数第二行要执行C函数,暂时中断B函数,B函数存入栈中等C函数执行完成,执行存在栈顶的B函数以此类推…...原创 2020-06-18 00:55:20 · 87 阅读 · 0 评论 -
数据结构(Java)之栈(2)-栈的基本实现
首先创建一个接口public interface Stack<E> { int getSize(); boolean isEmpty(); //向栈中添加元素 void push(E e); //从栈中取出元素 E pop(); //查看栈顶的元素 E peek();}接口实现类public class ArrayStack<E> implements Stack<E>{ Array<原创 2020-06-18 12:20:20 · 93 阅读 · 0 评论 -
数据结构(Java)之栈(3)-括号匹配
给定字符串"{[()]}",判断字符串是否有效.括号必须以正确的顺序匹配,"()“和”()[]{}“是有效的但是”(]“和”([)]"不是.思路:①声明一个栈 Stack②逐一遍历字符串中的每个字符③如果是左括号就压入栈④如果是右括号,我们看是否能和栈顶元素能与右括号匹配,匹配就出栈⑤如果栈中为空,此字符串是一个合法的括号匹配的字符串–栈顶元素反应了在嵌套的层次关系中,最近的需要匹配的元素import java.util.Stack;public class Solution {原创 2020-06-19 19:31:04 · 202 阅读 · 0 评论 -
数据结构(Java)之队列(1)-简单介绍与实现
队列也是一种线性结构(排队)相比数组,队列对应的操作是数组的子集只能从一端(队尾)添加元素,只能从另一端(队首)取出元素总结:队列是一种先进先出的数据结构(先到先得)First In First Out(FIFO)实现:与栈类似,先定义一个接口 Queuepublic interface Queue<E> { int getSize(); //判空 boolean isEmpty(); //入队 void enqueue(E e);原创 2020-06-19 20:12:08 · 123 阅读 · 0 评论