(1)顺序线性表(Java)

来源:互联网 发布:minecraft 下载 编程 编辑:程序博客网 时间:2024/06/05 08:54

 线性表的顺序存储结构是指用一组地址连续的存储单元依次存放线性表的元素,线性表中相邻元素ai和ai+1对应的存储地址loc(al)和loc(ai+1)也是相邻的

 线性表的基本操作有:

 ①初始化:通常一个构造器,用于创建一个空的线性表;

 ②返回线性表的长度;

 ③获取指定索引处的元素;

 ④按值查找数据元素的位置;

 ⑤直接插入数据元素;

 ⑥向指定位置插入数据元素;

 ⑦直接删除数据元素 ;

 ⑧删除线性表中指定位置的数据元素;

 ⑨判断线性表是否为空;

 ⑩清空线性表。

 顺序线性表的一个简单的源代码版本,这个实现了ArrayList部分功能,但是它是线程不安全的,在单线程下工作正常,但是多线程环境中可能引起线程安全问题:

 

package com.xuan.datastructs;import java.util.Arrays;public class SequenceList<T> {private int DEFAULT_SIZE=16;//定义一个默认数组长度//保存数组的长度private int capacity;//定义一个数组用于保存顺序线性表的元素private Object[] elementData;//保存顺序表中元素的当前个数private int size=0;//以默认数组长度创建空顺序线性表public SequenceList(){capacity=DEFAULT_SIZE;elementData=new Object[capacity];}//以一个初始化元素创建顺序线性表public SequenceList(T element){this();elementData[0]=element;size++;}/** * 以指定长度的数组来创建顺序线性表 * @param element 指定顺序线性表中第一个元素 * @param initSize 指定顺序线性表底层数组的长度 */public SequenceList(T element,int initSize){capacity=1;//把capacity设为大于initSize的最小的2的n次方while(capacity<initSize){capacity<<=1;//复合运算符,比如:a<<=b,意思就是a = a*(2的b次方)}elementData=new Object[capacity];elementData[0]=element;size++;}//获取顺序线性表的大小public int length(){return size;}//获取顺序表中索引为i处的元素public T get(int i){if(i<0||i>size-1){throw new IndexOutOfBoundsException("线性表索引越界");}return (T)elementData[i];}//查找顺序线性表中指定元素的索引public int locat(T element){for(int i=0;i<size;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 add(T element){insert(element,size);}//此方法麻烦,并且性能很差private void ensureCapacity(int minCapacity){//如果数组的原有长度小于目前所需的长度if(minCapacity>capacity){//不断将capacity*2,直到capacity大于minCapacitywhile(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 numMoved=size-index-1;if(numMoved>0){System.arraycopy(elementData, index+1, elementData, index, numMoved);}//清空最后一个元素elementData[--size]=null;return oldValue;}//删除顺序线性表中最后一个元素public T remove(){return delete(size-1);//调用上面的删除最后一个元素的方法,即删除size-1的元素即可}//判断顺序线性表是否为空表public boolean empty(){return size==0;}//清空线性表public void clear(){//将底层数组所有元素赋为nullArrays.fill(elementData, null);size=0;}public String toString(){if(size==0){return "[]";}else{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();}}//测试public static void main(String[] args) {SequenceList<String> list=new SequenceList<String>();list.add("aaaa");list.add("bbbb");list.add("cccc");//在索引为1处插入一个新元素list.insert("dddd", 1);//输出顺序线性表中的元素System.out.println(list);//删除索引为2处的元素list.delete(2);System.out.println(list);//获取cccc字符串在顺序线性表中的位置System.out.println("cccc在顺序线性表中的位置:"+list.locat("cccc"));}}


0 0
原创粉丝点击