线性表--顺序储存结构 java实现

本文介绍了一种基于Java实现的线性表数据结构,详细解释了线性表的基本概念及其实现方式,包括顺序存储结构的创建、基本操作如插入、删除等,并提供了一个简单的测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、线性表:由n(n>=0)个数据元素组成的有限序列。

   对于一个非空、有限的线性表,总具有如下特征:

1)总存在唯一的第一个数据元素

2)总存在唯一的最后一个数据元素

3)除第一个数据元素外,集合中的每一个数据元素都只有一个前驱的数据元素

4)除最后一个数据元素外,集合中的每个数据元素都只有一个后继的数据元素

顺序存储结构:

是指用一组地址连续的存储单元一次存放线性表的元素。

为了使用顺序存储的线性表,程序通常采用数组来保存线性表中的元素。顺序存储的线性表是一种随机存储的储存结构。

import java.util.Arrays;

public class ArrayList<T>
{
    private int DEFAULT_SIZE = 10;//数组默认长度
    private int capacity;//保存数组的长度
    private Object[] elementData;//数组对象的引用
    private int size = 0;//保存顺序表中当前元素的个数
    
    public ArrayList()//构造器 以默认数组长度创建顺序线性表
    {
    	capacity = DEFAULT_SIZE;//线性表默认长度为10
    	elementData = new Object[capacity];
    }
    
    public ArrayList(T element)//以一个初始化元素创建一个顺序线性表
    {
    	this();
    	elementData[0]=element;
    	size++;
    }
    
    public ArrayList(int initSize)//指定长度的数组来创建顺序线性表
    {
    	capacity = 1;
    	while(capacity < initSize)
    	{
    		capacity <<= 1;
    	}
    	elementData = new Object[capacity];
    }
    
    //获取线性表的长度
    public int length()
    {
    	return size;
    }
    //获取指定位置的元素
    public T getElement(int index)
    {
    	if(index < 0 || index > size-1)
    	{
    		throw new IndexOutOfBoundsException("索引越界");
    	}
    	return (T)elementData[index];
    	
    }
    
    //查找
    //查找 指定元素的位置
    public int locateByElement(T element)
    {
    	for(int i = 0;i < size ;i++)
    	{
    		if(elementData[i] == 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);//从插入的位置开始复制直到最后一个元素
    	
    	//移动之后空出来的index的位置插入element
    	elementData[index] = element;
    	size++;
    	
    	
    	
    }
    
     //在表尾插入元素
    public void add(T element)
     { 
    	insert(element,size);
     }
    
    //检查是否需要对数组进行扩容,如果需要则对其扩容 原来数组中的元素及其职位保持不变
    public void ensureCapacity(int minCapacity)
    {
    	if(capacity < minCapacity)//如果当前的数组容量小于传进来的参数 则需要对数组进行扩容
    	{
    		while(capacity < minCapacity)
    		{
    			capacity <<= 1;//让capacity每次右移一位直到capacity大于传进来的参数
    		}
    		elementData = Arrays.copyOf(elementData,capacity);//对数组原来的内容进行拷贝并赋予其新的容量
    		//Arrays的copyOf()方法传回的数组是新的数组对象,第二个参数指定新的数组容量
         }
    }
    
    //删除指定位置的元素
    public T delete (int index)
    {
    	if(index < 0 || index > size-1)
    	{
    		throw new IndexOutOfBoundsException("索引越界");
    	}
    	T deleteElement = (T)elementData[index];//找到要删除的元素
		 
    	int move = size - index -1;//从index+1直到最后一个的总长度
    	System.arraycopy(elementData,index+1,elementData,index,move);
    	
    	elementData[--size] = null;//清空最后一个元素的引用
    	return deleteElement;
    }
    //判断线性表是否为空
    public boolean isEmpty()
    {
    	return size == 0;
    }
    
    //清空线性表
    public void clearAll()
    {
    	Arrays.fill(elementData,null);//第一个参数是一个数组变量,第二个参数是将数组中的所有值变为同一个value
    	size = 0;
    }
    
    //重写toString方法
    @Override
    public String toString()
    {
    	if(isEmpty())
    	{
    	     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 class ArrayListTest<T>
{
	public static void main(String[] args)
  {
	 ArrayList<String> list = new ArrayList<String>();
	    list.add("hello");
	    list.add("world");
	    list.add("java");
	    System.out.println(list);
	    list.insert("111",1);
	    System.out.println(list);
	    list.delete(2);
	    System.out.println(list);
	    list.clearAll();
	    System.out.println(list);
  }
}
结果:

[hello, world, java]
[hello, 111, world, java]
[hello, 111, java]
[]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值