数据结构——数组
什么是数组?
数组对应的英文是array,是有限个相同类型的变量所组成的有序集合,数组中的每一个变量被称为元素,数组是最为简单,最为常用的数据结构。
数组的每一个元素都有一个下标,只不过这个下标从0开始,一直到数组的长度减1。
另外,数组在内存中是顺序存储,也叫作顺序表。
如上图,绿色的格子代表空闲的储存单元,灰色的代表的是已占用的储存单元,白色的代表的是连续储存的数组元素。
数组的每一个元素中,都是存储在一个小小的内存单元中,并且元素之间都是紧密排列在一起的,既不能打乱元素的储存顺序,也不能跳过每个储存单元进行储存。
数据结构的基本操作无非是增,删,改, 查。
下面来看看增的操作——使用java语言实现
增加操作
/*
* 数組插入元素
*
*/
public void insert(int index, int element) throws IndexOutOfBoundsException {
//判断下标是否超出范围
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("下标超出范围");
}
//从右向左循环,将元素逐个向右挪一位
for(int i=size-1; i>=index; i--) {
array[i+1] = array[i];
}
//腾出的位置放入新元素
array[index] = element;
size++;
}
删除操作
/**
* 根据下标删除数组元素
*/
public int delete(int index) throws IndexOutOfBoundsException {
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("下标超出范围");
}
int deleteelement = array[index];
//向左向右循环,将元素逐个向左挪1个
for(int i=index; i<size-1; i++) {
array[i] = array[i+1];
}
size--;
return deleteelement;
}
修改操作
/*
* 根据下标修改数组元素
*/
public void alterelement(int index, int element) throws IndexOutOfBoundsException{
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("下标超出范围");
}
array[index] = element;
}
查找操作
/*
* 根据下标查找数组元素
*/
public int seek(int index) throws IndexOutOfBoundsException{
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("下标超出范围");
}
return array[index];
}
万一数组的空间用完需要扩容呢?
这里在添加一个扩容的操作
/*
* 数组的扩容
*/
public void resize() {
int[] newarray = new int[array.length+array.length/2]; //增加当前的元素长度的一半
System.arraycopy(array, 0, newarray, 0, array.length);
array = newarray;
}
返回数组的长度和输出数组的元素
/**
*
* @return 返回当前数组的元素个数
*/
public String size() {
return "当前元素长度为:"+array.length;
}
//输出元素
public void Output() {
for(int i=0; i<size; i++) {
System.out.print(array[i]+" ");
}
}
完整代码
public class TestArray01 {
private int[] array;
private int size;
public TestArray01(int capacity) {
this.array = new int[capacity];
this.size = 0;
}
/*
* 数組插入元素
*
*/
public void insert(int index, int element) throws IndexOutOfBoundsException {
//判断下标是否超出范围
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("下标超出范围");
}
//从右向左循环,将元素逐个向右挪一位
for(int i=size-1; i>=index; i--) {
array[i+1] = array[i];
}
//腾出的位置放入新元素
array[index] = element;
size++;
}
/**
* 根据下标删除数组元素
*/
public int delete(int index) throws IndexOutOfBoundsException {
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("下标超出范围");
}
int deleteelement = array[index];
//向左向右循环,将元素逐个向左挪1个
for(int i=index; i<size-1; i++) {
array[i] = array[i+1];
}
size--;
return deleteelement;
}
/*
* 根据下标修改数组元素
*/
public void alterelement(int index, int element) throws IndexOutOfBoundsException{
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("下标超出范围");
}
array[index] = element;
}
/*
* 根据下标查找数组元素
*/
public int seek(int index) throws IndexOutOfBoundsException{
if(index<0 || index>size) {
throw new IndexOutOfBoundsException("下标超出范围");
}
return array[index];
}
/*
* 数组的扩容
*/
public void resize() {
int[] newarray = new int[array.length+array.length/2]; //增加当前的元素长度的一半
System.arraycopy(array, 0, newarray, 0, array.length);
array = newarray;
}
/**
*
* @return 返回当前数组的元素个数
*/
public String size() {
return "当前元素长度为:"+array.length;
}
//输出元素
public void Output() {
for(int i=0; i<size; i++) {
System.out.print(array[i]+" ");
}
}
public static void main(String[] args) throws Exception {
TestArray01 array = new TestArray01(10);
array.insert(0, 4);
array.insert(1, 6);
array.insert(2, 9);
array.insert(3, 1);
array.insert(4, 3);
array.insert(5, 5);
array.insert(6, 8);
array.insert(7, 2);
array.Output();
}
}