线性顺序表的实现
顺序表(顺序存储的结构)
什么是顺序表
顺序表,全名顺序存储结构,是线性表的一种。线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。此外,线性表是逻辑,顺序表是这种逻辑结构在内存上的实现,顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。
package com.sxs;
import java.util.Arrays;
//线性顺序表
public class SequenceList<T> {
private final int DEFAULT_SIZE=8;
private int capacity; //数组长度
private int size=0; //当前数组中元素个数
private Object[] elementData; //线性表实现的底层数组
//默认初始化数组
public SequenceList() {
capacity=DEFAULT_SIZE;
elementData=new Object[capacity];
}
//当数组已经满了后扩大容量
private void boardCapacity(int ruleCapacity){
if(capacity<ruleCapacity){
//每次将数组容量按照原来扩大两倍,直到容量大于指定容量
while(capacity<ruleCapacity){
capacity=capacity*2;
}
elementData= Arrays.copyOf(elementData, capacity);
}
}
//获得线性表大小
public int getLength(){
return size;
}
//重写toString方法
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
for(int i=0;i<size;i++)
{
sb=sb.append(elementData[i]+" ");
}
return sb+"";
}
//按照顺序添加元素
public void add(T element){
insert(element,size);
}
public void insert(T element,int index){
if(index<0||index>size)
{
throw new IndexOutOfBoundsException("索引越界");
}
boardCapacity(size+1);
/*
* 在elementData中从index开始复制,复制长度size-index,将
* 复制的元素复制到目标数组elmentData的index+1位上直到后面结束
* 即将index位置空出,每个元素后移一位
*/
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index]=element;
size++;
}
//查找指定元素的位置
//返回-1即没找到
public String locate(T element){
StringBuilder sb=new StringBuilder();
for(int i=0;i<size;i++)
{
if(element.equals(elementData[i]))
{
sb=sb.append(i+" ");
}
}
if(sb.length()<=0)
return "无此元素";
return sb+"";
}
//删除指定位置的元素
//@param index 元素索引
public void delete(int index){
if(index<0||index>size)
{
throw new IndexOutOfBoundsException("索引越界");
}
int length=size-index-1;
//删除元素所有元素向前移动
if(length>0)
System.arraycopy(elementData, index+1, elementData, index, length);
//将最后一个数删除
elementData[--size]=null;
}
public boolean isEmpty(){
if(size>0){
return false;
}
return true;
}
//清空线性表数据
public void clearSequenceList(){
if(elementData!=null){
for(int i=0;i<size;i++)
{
elementData[i]=null;
}
size=0;
}
}
//根据索引得到元素
public Object get(int index){
return elementData[index];
}
//删除最后一个元素
public void remove(){
delete(size-1);
}
//遍历线性表
public void printSequenceList(){
if(elementData==null){
System.out.println("当前无数据");
}else{
for(int i=0;i<size;i++)
{
System.out.print(elementData[i]+" ");
}
}
}
}
文章引用:
链接:https://blog.csdn.net/weixin_42826139/article/details/88547215
https://blog.csdn.net/xichang702/article/details/73505933?spm=1001.2014.3001.5501