使用java实现线性表的顺序存储

之前就学过数据结构这门课,当时有用c/c++实现过线性表的顺序存储、单链表、双向链表、顺序栈、链栈、图等数据结构;学了java也有一段时间了,最近一直在为投简历求值而努力着,想着对于大公司来说,对于本科生的要求基本上都要熟悉或者掌握常用的数据结构以及算法,所以准备着重新用java实现一遍以前学过的、现在也很常用或者很常考的一些数据结构以及算法。如果大家在阅读的时候发现有什么不合理的地方,还请大家指正!

                                线性表之顺序存储-----java实现

要求:
     * 1.设置一个常量:常量在默认构造的时候会用到,用来构造初始化长度的数组;
     * 2.设置两个变量,size:用来存储数组中元素的个数,capacity:用来存储数组的长度;
     * 3.设置一个数组,该数组用来存储元素;
     * 4.具备多个构造函数,一个初始化默认构造,默认存储大小为16;另一个为可以接收长度的构造;
     * 5.提供如下几个功能:
     *      a.获取线性表的大小(size)
     *      b.根据索引返回元素
     *      c.根据元素查找在线性表中出现的第一个位置
     *      d.向顺序表中的指定位置插入元素
     *      e.在线性表的末端添加一个元素
     *      f.删除指定索引出的元素
     *      g.删除最后一个元素
     *      h.判断线性表是否为空
     *      i.清空线性表

java代码实现如下:

import java.util.Arrays;

public class SequenceTable<T> {
	
	private static int DEFAULT_LENGTH=16;//线性表的默认长度
	private int size=0;//元素个数
	private int capacity;//当前线性表的空间大小
	private Object[] elementData;//用一个数组来存储数据,代表一个线性表
	
	//默认构造
	public SequenceTable(){
		elementData=new Object[DEFAULT_LENGTH];
		capacity=DEFAULT_LENGTH;
	}
	
	//带一个元素的默认构造
	public SequenceTable(T element){
		elementData=new Object[DEFAULT_LENGTH];
		capacity=DEFAULT_LENGTH;
		elementData[size]=element;
		size++;
	}
	
	//指定线性表长度的构造
	public SequenceTable(int length){
		capacity=length;
		elementData=new Object[capacity];
	}
	
	//返回线性表的元素个数
	public int size(){
		return this.size;
	}
	
	//根据索引取元素
	@SuppressWarnings("unchecked")
	public T get(int index){
		if(index>size-1||index<0){
			throw new IndexOutOfBoundsException("索引的位置超出线性表的边界");
		}
		
		return (T)elementData[index];
	}
	
	//判断元素在线性表中出现的第一个位置
	public int indexOf(T element){
		for(int i=0;i<size-1;i++){
			if(elementData[i].equals(element)){
				return i;
			}
		}
		return -1;
	}
	
	//在指定的位置上添加一个元素
	public void add(int index,T element){
		if(index<0||index>size){
			throw new IndexOutOfBoundsException("索引的位置超出线性表的边界");
		}
		//新增的时候需要判断当前数组的长度是否足够,如果不够要扩展
		ensureCapacity(size+1);
		for(int i=size-1;i>=index;i--){//从数组的最后一个元素到index位置的元素进行复制
			elementData[i+1]=elementData[i];
		}
		elementData[index]=element;
		size++;
	}
	
	//默认在线性表的最后添加一个元素
	public void add(T element){
		add(size,element);
	}
	
	private void ensureCapacity(int minLength){
		if(capacity<minLength){
			while(capacity<minLength){
				capacity<<=1;//capacity左移一位,等于*2;
			}
			elementData=Arrays.copyOf(elementData, capacity);
		}
	}
	
	//删除指定位置的元素
	public T delete(int index){
		if(index<0||index>size-1){
			throw new IndexOutOfBoundsException("索引的位置超出线性表的边界");
		}
		
		@SuppressWarnings("unchecked")
		T oldValue=(T)elementData[index];
		//移动元素,从index开始到线性表的结束。
		for(int i= index;i<size-1;i++){
			elementData[i]=elementData[i+1];
		}
		elementData[size-1]=null;
		size--;
		return oldValue;
	}
	
	//默认移除线性表的最后一个元素
	public T remove(){
		return delete(size-1);
	}
	
	//判断线性表是否为空
	public boolean isEmpty(){
		return size==0;
	}
	
	//清空线性表
	public void clear(){
		for(int i=0;i<size;i++){
			elementData[i]=null;
		}
		size=0;
	}
	
	public String toString(){
		String s="[";
		if(isEmpty()){
			return "[]";
		}else{
			for(int i=0;i<size;i++){
				if(i<size-1){
					s+=elementData[i]+",";
				}else{
					s+=elementData[i]+"]";
				}
				
			}
			return s;
		}
	}
}

接下来是单链表,加油!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值