文章目录
一. 数据结构
1.1 数据结构概述
数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。
数据的逻辑结构指反映数据元素之间的逻辑关系,而与他们在计算机中的存储位置无关:
- 集合(数学中集合的概念):数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
- 线性结构:数据结构中的元素存在一对一的相互关系;
- 树形结构:数据结构中的元素存在一对多的相互关系;
- 图形结构:数据结构中的元素存在多对多的相互关系。
数据的物理结构/存储结构:是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等,一种数据逻辑结构可表示成一种或多种物理存储结构。
数据结构的基本操作的设置的最重要的准则是,实现应用程序与存储结构的独立。实现应用程序是“逻辑结构”,存储的是“物理结构”。逻辑结构主要是对该结构操作的设定,物理结构是描述数据具体在内存中的存储。
例如:线性表、队列、栈等线性逻辑结构可以使用顺序结构实现也可以使用链式结构实现。顺序存储结构中,线性表、队列、栈等逻辑顺序和物理顺序总是一致的。但在链式存储结构中,它们的逻辑顺序和物理顺序一般是不同的。
1.2 顺序存储结构之数组
逻辑结构:线性的
物理结构:连续的存储空间
申请内存:一次申请一大段连续的空间,一旦申请到了,内存就固定了。
存储特点:所有数据存储在这个连续的空间中,数组中的每一个元素都是一个具体的数据(或对象),所有数据都紧密排布,不能有间隔。
例如:整型数组
例如:对象数组
1.3 链式存储结构
逻辑结构:有线性的和非线性的
物理结构:不要求连续的存储空间
存储特点:数据必须封装到“结点”中,结点包含多个数据项,数据值只是其中的一个数据项,其他的数据项用来记录与之有关的结点的地址。
例如:以下列出几种常见的链式存储结构(当然远不止这些)
单链表
单链表结点:
class Node{
Object data;
Node next;
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
单链表:
public class OneWayLinkedList<E>{
private Node<E> head;//头结点
private int total;//记录实际元素个数
private static class Node<E>{
E data;
Node<E> next;
Node(E data, Node<E> next) {
this.data = data;
this.next = next;
}
}
}
双链表
双链表结点:
class Node{
Node prev;
Object data;
Node next;
public Node(Node prev, Object data, Node next) {
this.prev = prev;
this.data = data;
this.next = next;
}
}
双向链表:
public class LinkedList<E>{
private Node<E> first;//头结点
private Node<E> last;//尾结点
private int total;//记录实际元素个数
private static class Node<E>{
Node<E> prev;
E data;
Node<E> next;
Node(Node<E> prev, E data, Node<E> next) {
this.prev = prev;
this.data = data;
this.next = next;
}
}
}
二叉树
二叉树结点:
class Node{
Node parent;
Node left;
Object data;
Node right;
public Node(Node parent,Node left, Object data, Node right) {
this.parent = parent;
this.left = left;
this.data = data;
this.right = right;
}
}
二叉树
public class BinaryTree<E>{
private Node<E> root;
private int total;
private static class Node<E>{
Node<E> parent;
Node<E> left;
E data;
Node<E> right;
public Node(Node<E> parent, Node<E> left, E data, Node<E> right) {
this.parent = parent;
this.left = left;
this.data = data;
this.right = right;
}
}
}
1.4 自定义逻辑结构基本操作接口
对于数据结构最最基本的操作无非就是增、删、改、查。
public interface Container<E>{
void add(E e);
default void insert(int index,E value){
throw new UnsupportedOperationException();
}
void delete(E e);
default void delete(int index){
throw new UnsupportedOperationException();
}
default E update(int index, E value){
throw new UnsupportedOperationException();
}
void update(E old, E value);
boolean contains(E e);
default int indexOf(E e){
throw new UnsupportedOperationException();
}
default E get(int index){
throw new UnsupportedOperationException();
}
Object[] getAll();
int<