数据结构是计算机存储、组织数据的方式。它研究的是数据的逻辑结构和物理结构以及它们之间的相互关系。同一逻辑结构 可以对应不同的存储结构,算法的设计取决于数据的逻辑结构,实现依赖于指定的存储结构。
逻辑结构包括:
1.集合:数据结构中的元素除了“同属于一个集合”的相互关系外,没有其他关系。
2.线性结构:数据结构中的元素存在一对一的相互关系。
3.树形结构:数据结构中的元素存在一对多的相互关系。
4.图形结构:数据结构中的元素存在多对多的相互关系。
一、线性结构
线性结构是n个数据元素的有限序列。
实现方式有两种:
1.使用数组存储线性表的元素(用一组连续的存储单元依次存储线性表的数据元素)
2.使用链表存储线性表的元素(用一组任意的存储单元依次存储线性表的数据元素)
数组是一种固定大小的数据结构,优点在于可以通过下标来访问或修改元素比较高效,缺点在于插入和删除开销较大。
int[] array = new int[10];
链表是一种物理存储单元上非连续、非顺序的存储结构,由一系列节点组成,这些节点不必在内存中相连,每个节点由数据部分Data和链部分Next组成,这样当添加或者删除时,只需要改变相关节点的Next的指向,效率很高。
链表实现方式:
1.循环单链表:链表的最后一个节点指向第一个节点形成一个循环。
2.双向链表:一个节点中包含两个指针,一个指向前方,一个指向后方。
3.循环双向链表:第一个节点的前指针指向最后一个节点,最后一个节点的后指针指向第一个节点
//节点
class Node<E>{
E item;
Node<E> next;
//构造函数
Node(E element) {
this.item = element;
this.next = null;
}
}
class test{
void test(){
//头节点和尾节点都为空 链表为空
Node<E> head = null;
Node<E> tail = null;
head = new Node("one");
tail = new Node("two");
head.next = tail;
System.out.println(head.item);
}
}
3.栈(stack)是限制插入和删除只能在一个位置上的链表,遵循先进后出的规律。应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等
4.队列(Queue)是队尾插入、队头删除的链表,遵循先进先出的规律,可以用LinkedList来实现。应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。
public class MyQueue<E> {
private LinkedList<E> list = new LinkedList<>();
// 入队
public void enqueue(E e) {
list.addLast(e);
}
// 出队
public E dequeue() {
return list.removeFirst();
}
}
二、树形结构
1.堆(heap)用来存放new创建的对象和数组,当实体不再被指向时,JVM启动垃圾回收机制,自动清除。
2.树:有n(n>=1)个有限节点组成一个具有层次关系的集合,每个节点有>=0个子节点,没有父节点的节点为根节点,一个非根节点只有一个父节点,每个非根节点都可以有多个不相交的子节点:
3.二叉树:最多只有两个子节点的树被称为二叉树,常用语二叉查找树和二叉堆。
特点:二叉树的每个节点最多有两个子节点,子节点有左右之分,次序不能颠倒。
二叉树的第i层至多有2^(i-1)个子节点,深度为k的话最多有2^k-1个子节点。
一棵深度为k,且有2^k-1个节点的二叉树称之为 满二叉树 ; 深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为 完全二叉树 。
二叉查找树(二叉排序树)或者是一棵空树,或者是具有下列性质的二叉树: (1) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2) 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3) 左、右子树也分别为二叉排序树;(4) 没有键值相等的结点。
三种遍历方法:
(1) 先序遍历 若二叉树为空,则空操作,否则先访问根节点,再先序遍历左子树,最后先序遍历右子树。
2) 中序遍历 若二叉树为空,则空操作,否则先中序遍历左子树,再访问根节点,最后中序遍历右子树。
(3) 后序遍历 若二叉树为空,则空操作,否则先后序遍历左子树访问根节点,再后序遍历右子树,最后访问根节点。
三、图形结构
图是一种较线性表和树更为复杂的数据结构,在线性表中,数据元素之间仅有线性关系,在树形结构中,数据元素之间有着明显的层次关系,而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。图的应用相当广泛,特别是近年来的迅速发展,已经渗入到诸如语言学、逻辑学、物理、化学、电讯工程、计算机科学以及数学的其他分支中。