java基础笔记(三)之数据结构

    技术2022-07-10  152

    最近开始刷leetcode,发现许多题目都是算法题,题中涉及到了各种数据结构的实现与拓展。虽然大二上学过数据结构与算法,但是现在已经忘了许多,现在借此机会复习以下。数据结构与算法均使用java语言代码实现。

    (一)线性结构

    线性表是一种最常用且最简单的数据结构,它是n个元素的有限序列。一般来说实现线性表有两种方法,一种是采用连续存储空间的数组,另一种是采用链表。 (1)数组 数组是一种采用连续空间存储,大小固定的数据结构。一般来说,每种编程语言都已经实现了数组这种常用结构,只需创建调用即可。 java语言中可以通过以下的语句创建数组:

    int[] array = new int[5];

    数组一般定义时必须指名长度,若出现新添元素超出数组长度,一般可采用以下方法解决: (1)创建一个更长的数组,将所有元素移到该数组中。 (2)采用一些例如ArrayList的集合类替代数组。 数组的优点是可以利用下标来访问数组元素,较为高效,缺点是每次进行数组元素的增删时,需要重新移动整个数组,效率低下。

    (2)链表 链表是一种物理上非连续的数据结构,链表的顺序由它的指针实现。一般来说,链表有单向链表,双向链表和循环链表,下面以单链表的实现为例:

    class Node{ //指针与数据 Node next = null; int data; //构造器 Node(int element){ this.data = element; this.next = null; } } //调用 Node node1 = new Node(5); Node node2= new Node(6); node1.next = node2;

    (3)栈 栈是一种比较特殊的线性结构。对于栈来说,数据只能从栈顶进入(push),也只能从栈顶出去(pop),这是一种后进先出的思想。你只能访问栈的栈顶元素。在java中存在Stack类,对应栈这种数据结构,使用方法如下:

    Stack<String> stringStack = new Stack<>(); stringStack.push("hello"); stringStack.push("World"); String s1 = stringStack.pop();

    当然,由于栈是一种特殊的表,你也可以利用Java中提供的各种表的基础之上实现栈结构。

    (4)队列 和栈类似,队列也是一种特殊的线性结构。在队列中,你只能从队列的尾部加入数据,访问队列的首部数据。这是一种后进后出的思想。在java中存在Queue接口,对应队列这种数据结构,具体使用方法如下:

    Queue<Integer> integerQueue = new LinkedList<>(); integerQueue.add(1); integerQueue.add(2); int i1 = integerQueue.remove(); System.out.println(i1);

    注意:java中并没有Queue类,但是java中的LinkList实现了Queue接口。

    (二)非线性结构

    (1)二叉树 树是一种非常重要的数据结构,这里以二叉树为例介绍这种数据结构。二叉树是一种具有层级结构的数据结构,具体结构如下图所示: 关于树的知识点还有很多。 二叉树的性质(各层结点规律)。。。 二叉树的遍历方法(前中后序)。。。 二叉树的分类(满二叉树)。。。 各种基于二叉树的树(红黑树)。。。 这里由于篇幅不多介绍。二叉树的实现代码如下:

    class doubletree{ doubletree left = null; doubletree right = null; int treedata; //构造器 public doubletree(int treedata){ this.treedata = treedata; } }

    (2)图 图,是一种比树更为复杂的数据结构。树的节点之间是一对多的关系,并且存在父与子的层级划分;而图的顶点(注意,这里不叫节点)之间是多对多的关系,并且所有顶点都是平等的,无所谓谁是父谁是子。图的结果如下所示: 可以采用邻接矩阵或者邻接表实现图。 可以参考链接:漫画,你为什么要去了解图

    Processed: 0.011, SQL: 9