1.线性表与非线性表
线性表以实现方式分为顺序结构(数组)和链式结构(链表)。
这里的线性是指的逻辑上的线性,即只要数据的保存满足了一对一关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接没有例外;就可以说这是一个线性表,而非线性表参考图、数,往往数据间的关系是一对多、多对一等。
2.数组
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
好的,这里存在着三个关键词,线性表、连续内存空间、以及相同类型数据。我们一个个看。
线性表我们前面已经说过了,现在来看看连续内存空间以及相同类型数据:正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。
当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:
a[i]_address=base_address+i*data_type_size
具体实现:
public class Array<E>{
//数组底层实现
private E[] data;
private int size;
public Array(int capacity){
data=(E[])new Object[capacity];
size=0;
}
public Array(){
//无参数构造函数,默认容量为10
this(10);
}
private void resize(int newcapacity){
E[] newdata=(E[])new Object[newcapacity];
for(int i=0;i<size;i++){
newdata[i]=data[i];
}
data=newdata;
}
public void insertElem(int index,E value){
//增
if(index<0||index>size){
throw new IllegalArgumentException("越界!");
}
//Java的arrayList动态扩充为1.5倍
if(size==data.length){
resize(2*data.length);
}
for(int i=size;i>index;i--){
data[i]=data[i-1];
}
data[index]=value;
size++;
}
public E deleteElem(int index){
//删
if(index<0||index>size){
throw new IllegalArgumentException("越界!");
}
E a