java数据结构实现顺序表示例_java

复制代码 代码如下:

import java.util.Arrays;
/**
 * 顺序线性表的实现
 */
public class LineList<E>{

 private int size;   //长度
 private Object[] array;  //底层数组
 private final int default_length=16; //默认长度
 /**
  * 无参构造方法
  */
 public LineList(){
  size = 0;
  //使用默认长度构造数组
  array = new Object[default_length];
 }
 /**
  * 指定长度进行构造
  * @param length 指定初始长度
  */
 public LineList(int length){
  if(length<0){
   throw new IllegalArgumentException("初始长度不合法:"+length);
  }
  //使用指定长度构造数组
  array = new Object[length];
 }

 /**
  * 指定初始化元素和长度进行构造
  * @param element 初始化元素
  * @param length 初始化长度
  */
 public LineList(E element,int length){
  if(length<1){
   throw new IllegalArgumentException("初始长度不合法:"+length);
  }
  //使用指定长度构造数组
  array = new Object[length];
  //初始化第一个元素
  array[0] = element;
  size++;
 }
 /**
  * 指定初始化元素进行构造
  * @param element 初始化元素
  */
 public LineList(E element){
  //使用默认长度初始化数组
  array = new Object[default_length];
  //初始化第一个元素
  array[0] = element;
 }

 /**
  * 获取元素个数
  */
 public int size() {
  return size;
 }

 /**
  * 判断是否为空
  */
 public boolean isEmpty() {
  return size==0;
 }

 /**
  * 判断是否包含此元素
  */
 public boolean contains(E e) {
  if(indexOf(e) == -1){
   return false;
  }
  return true;
 }

 /**
  * 格式化为数组
  */
 public Object[] toArray() {
  return Arrays.copyOf(array, size);
 }

 /**
  * 向线性表尾部添加一个元素
  * @param e
  * @return
  */
 public void add(E e) {
  extendCapacity(size+1);
  array[size]=e;
  size++;
 }

 /**
  * 扩容
  * @param length 需要的长度
  */
 private void extendCapacity(int length){
  //当前数组长度和需要的长度取最大
  int minCapacity = Math.max(array.length, length);
  //判断是否需要扩容
  if(minCapacity - array.length>0){
   //数组长度增加一半
   int newLength = array.length + array.length/2;
   //如果新的长度还比需求要小,将需求的长度作为数组长度
   if(newLength < minCapacity){
    newLength=minCapacity;
   }
   //数组长度不能超过Integer.Max_Value
   if(newLength > Integer.MAX_VALUE - 8){
    newLength = Integer.MAX_VALUE;
   }
   //数组扩容
   array = Arrays.copyOf(array, newLength);
  }
 }
 /**
  * 从线性表中移除所有此元素
  * @param e 需要移除的元素
  * @return
  */
 public void removeAll(E e) {
  if(e==null){
   for(int i=0;i<size;i++){
    if(array[i]==null){
     fastRemove(i);
    }
   }
  }else{
   for(int i=0;i<size;i++){
    if(e.equals(array[i])){
     fastRemove(i);
    }
   }
  }
 }

 /**
  * 删除索引处元素,后面的元素依次前移
  * @param index 需要删除的索引
  */
 private void fastRemove(int index){
  if(size-index-1>0){  
   //数组从index+1开始全部前移
   System.arraycopy(array, index+1, array, index, size-1);
  }
  //最后一个元素请空
  array[--size]=null;
 }

 /**
  * 清空线性表
  */
 public void clear() {
  //将数组全部填充为null
  Arrays.fill(array, null);
  //将元素个数改为0
  size=0;
 }
 /**
  * 获得索引处的元素
  * @param index
  * @return 索引处的元素
  */
 @SuppressWarnings("unchecked")
 public E get(int index) {
  checkIndex(index);
  return (E)array[index];
 }

 /**
  * 验证是否为索引越界
  * @param index
  */
 private void checkIndex(int index){
  if(index>=size || index<0){
   throw new IndexOutOfBoundsException("索引越界");
  }
 }

 /**
  * 将索引处的元素修改为新的元素
  * @param index 索引位置
  * @param element 元素
  * @return 原索引处的元素
  */
 @SuppressWarnings("unchecked")
 public E set(int index, E element) {
  checkIndex(index);
  E e = (E)array[index];
  array[index]=element;
  return e;
 }

 /**
  * 在指定的索引处插入指定的元素
  * @param index 索引位置
  * @param element 元素
  */
 public void add(int index, E element) {
  //验证索引
  checkIndex(index);
  //是否需要扩容
  extendCapacity(size+1);
  //复制数组
  System.arraycopy(array, index, array, index+1, size-index);
  array[index]=element;
 }

 /**
  * 移除索引处的元素
  * @param index 索引
  * @return 删除了的元素
  */
 @SuppressWarnings("unchecked")
 public E remove(int index) {
  checkIndex(index);
  //取得索引位置的元素
  E e = (E)array[index];
  fastRemove(index);
  return e;
 }

 /**
  * 取得元素第一次出现的位置的索引
  * @param e 要查找的元素
  * @return 如果为-1说明线性表没有这个元素
  */
 public int indexOf(E e) {
  if(e==null){
   for(int i=0;i<size;i++){
    if(e==array[i]){
     return i;
    }
   }
  }
  for(int i=0;i<size;i++){
   if(e.equals(array[i])){
    return i;
   }
  }
  return -1;
 }

 /**
  * 取得元素最后一次出现的位置的索引
  * @param e 要查找的元素
  * @return 如果为-1说明线性表没有这个元素
  */
 public int lastIndexOf(E e) {
  //判断元素是否为null
  if(e==null){    
   for(int i=size-1;i>=0;i--){
    if(e==array[i]){
     return i;
    }
   }
  }
  for(int i=size-1;i>=0;i--){
   //如果为null这里会跑出NullPoint异常
   //所以前面要加上验证是否为Null
   if(e.equals(array[i])){
    return i;
   }
  }
  return -1;
 }

 /**
  * 截取线性表
  * @param fromIndex 开始索引
  * @param toIndex 结束索引
  * @return 截取的线性表
  */
 @SuppressWarnings("unchecked")
 public LineList<E> subList(int fromIndex, int toIndex) {
  //判断开始索引是否越界
  if(fromIndex<0 || fromIndex >=size){
   throw new IndexOutOfBoundsException("开始索引越界:"+fromIndex);
  }
  //判断结束索引是否越界
  if(toIndex >=size || fromIndex <0){
   throw new IndexOutOfBoundsException("结束索引越界:"+toIndex);
  }
  //判断开始索引和结束索引是否正确
  if(fromIndex > toIndex){
   throw new IllegalArgumentException("参数不正确,开始索引应大于等于结束索引");
  }
  LineList<E> list = new LineList<E>();
  for(int i=fromIndex,j=toIndex;i<=j;i++){
   list.add((E)array[i]);
  }
  return list;
 }
}

时间: 2024-10-31 20:20:23

java数据结构实现顺序表示例_java的相关文章

java对象初始化顺序验证示例_java

复制代码 代码如下: public class Derive extends Base {    private Member m1 = new Member("Member 1");    {        System.out.println("Initial Block()");    }     public Derive() {        System.out.println("Derive()");    }     privat

java类的问题-java数据结构,线性表操作,C(X)=A(X)+B(X)多项式想加

问题描述 java数据结构,线性表操作,C(X)=A(X)+B(X)多项式想加 C(X)=A(X)+B(X)多项式想加.PolySLinkedList类增加C(X)=A(X)+B(X)多项式想加功能,算法实现不依赖于深拷贝,将A和B两条多项式单链表中的所以结点相加合并到新建的C多项式单链表,不改变A和B多项式单链表

Java 数据结构链表操作实现代码_java

 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表.循环链表.双向链表,下面将逐一介绍.链表在数据结构中是基础,也是重要的知识点,这里讲下Java 中链表的实现, JAVA 链表操作:单链表和双链表 主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都相应的应用,链表有多种类别,文章针对单链表和双链表进行分析.链表中数据就像被一个

算法与数据结构之顺序表顺序表

著名的计算机科学家N.Wirth教授曾提出一个公式:算法+数据结构=程序 "数组"类型表示顺序存储结构,用指针来表示链式存储结构.指针p指向下一个对象单元,p的值不是一增加1,而是增加对象类型所占的字节数. 一个结构提示类型student,没有定义变量,就不会分配存储单元,不能再程序中直接访问结构体类型名. 线性表是N个具有相同特性的数据元素的有限序列.线性表分为 顺序存储结构和链式存储结构. 顺序表: /*顺序表的建立与输出*/ #include<stdio.h>#inc

【Java数据结构】线性表

线性表 线性表是最基本.最简单.也是最常用的一种数据结构. 线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部.比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储),但是把最后一个数据元素的尾指针指向了哨位结点).  我们说"线性"和"非线性",只在逻辑层次上讨论,而不考虑存储层次,所以双向链表和循环链表依旧是线性表. 在数据结构逻辑层次上细分,线性表可分为

java九九乘法表示例_java

复制代码 代码如下: public class Nine {  public static void main(String[] args) {  int s=2;  for(int i=1;i<10;i++)  {    if(i==1){    System.out.print("*|");    System.out.print(i+"     ");   }   else   System.out.print(i+"       "

JAVA HashMap详细介绍和示例_java

第1部分 HashMap介绍HashMap简介HashMap 是一个散列表,它存储的内容是键值对(key-value)映射.HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口.HashMap 的实现不是同步的,这意味着它不是线程安全的.它的key.value都可以为null.此外,HashMap中的映射不是有序的.HashMap 的实例有两个参数影响其性能:"初始容量" 和 "加载因子".容量

详解DES加密算法及在Java程序中的使用示例_java

DES加密算法DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来. DES算法的入口参数有三个:Key.Data.Mode.其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密. DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥

JAVA实现双边决策的示例_java

现实生活中存在很多问题,比如商品买卖如何实现商家利润最大化?大学生招生录取如何实现整体效果最好?病人医生如何实现整体服务水平最高等?这些我们都可以把他统一的转化为双边决策问题.下面先说说自己对双边决策的理解. 双边决策--个人理解 为了帮助大家理解,我用一个简单的例子介绍什么是双边决策,加入现在市场上有10位顾客,分别为A0.A1.A2.A3.A4.A5.A6.A7.A8.A9,市场上有是个商品,分别为B0.B1.B2.B3.B4.B5.B6.B7.B8.B9,现在要求要把这10个商品分别分给这