线性表是由n个数据元素a1,a2,a3……an组成的有限序列,线性表的顺序存储结构是指用一组地址连续的存储单元依次存放线性表的元素。
换句话说,线性表的顺序存储结构中数据元素的物理关系和逻辑关系是一致的。
为了使用顺序存储结构实现线性表,程序通常会采用数组来保存线性表中的数据元素。
下面是一个简单的用java语言编写的顺序线性表的源代码:
package Algorithms;
import java.util.Arrays;
/*要实现的基本操作
* 初始化:通常是一个构造器,用于创建一个空的线性表
* 获取线性表的长度
* 获取指定索引处的元素
* 按值查找元素的位置:成功返回索引,否则返回-1
* 插入数据元素:向线性表中插入一个数据元素,线性表长度+1
* 删除线性表中指定位置的数据元素:线性表的长度减1,如果是空表,则抛出错误
* 判断线性表是否为空:空,返回true,否则返回false
* 清空线性表:将线性表清空
* */
public class SquenceList<T>
{
private int DEFAULT_SIZE = 16;//默认长度
private int capacity;//保存数组的长度
private Object[] elementData;//定义一个数组用来保存顺序线性表中的元素,Objcet方便扩展
private int size = 0;//记录顺序线性表中元素的当前个数
public SquenceList() {//以默认数组长度创建空顺序线性表
capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
}
public SquenceList(T element){//以一个初始化元素创建顺序线性表
this();
elementData[0] = element;
size++;
}
/**
* 以指定长度的数组来创建线性表
* @param element 指定顺序线性表中第一个元素
* @param initSize 指定顺序线性表底层数组的长度
*/
public SquenceList(T element,int initSize){
capacity = 1;
//把capacity设置为大于initSize的最小2的n次方
while(capacity<initSize){
capacity<<=1;
}
elementData = new Object[capacity];
elementData[0] = element;
size++;
}
public int length(){
return size;
}
//根据索引查找元素
public T get(int i){
if(i<0||i>=size)
throw new IndexOutOfBoundsException("线性表索引越界了");
return (T) elementData[i];
}
//查找顺序线性表中指定元素的索引,不成功返回-1
public int locate(T element){
for(int i=0;i<elementData.length;i++)
if(elementData[i].equals(element))
return i;
return -1;
}
//在指定索引处插入元素
public void insert(T element,int index){
if(index<0||index>size){
throw new IndexOutOfBoundsException("线性表索引越界了");
}
ensureCapacity(size+1);
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = element;
size++;
}
public void ensureCapacity(int mincapacity){
//如果数组的原有长度小于目前所需要的长度
if(mincapacity>capacity){
while(capacity<mincapacity)
capacity<<=1;
elementData = Arrays.copyOf(elementData,capacity);
}
}
public T delete(int index){
if(index<0||index>size-1){
throw new IndexOutOfBoundsException("线性表索引越界了");
}
T oldValue = (T) elementData[index];
int numMove = size-index-1;
if(numMove>0)
System.arraycopy(elementData, index+1, elementData, index, numMove);
elementData[--size] = null;
return oldValue;
}
public boolean empty(){
return size==0;
}
//清空数组,以空填充
public void clear(){
Arrays.fill(elementData, null);
size = 0;
}
//将线性表中的内容转换为字符串
public String toString(){
if(size==0)
return "[]";
StringBuilder sb = new StringBuilder("[");
for(int i=0;i<size;i++)
sb.append(elementData[i].toString()+", ");
int len =sb.length();
return sb.delete(len-2, len).append("]").toString();//删除最后的逗号和空格,然后添加]
}
}