JAVA基础(62)---线性结构和线性表的实现

线性结构的定义

若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前趋和一个直接后继。
可表示为:(a1 ,  a2   , ……,    an)

线性结构的特点

                    ① 只有一个首结点和尾结点;
                    ② 除首尾结点外,其他结点只有一个直接前驱和一个直接后继

简言之,线性结构反映结点间的逻辑关系是 一对一的

线性结构包括线性表、堆栈、队列、字符串、数组等等,其中,最典型、最常用的是线性表

 线性表的定义

             同一线性表中的元素必定具有相同特性  

线性表的重要基本操作

                                           初始化、取值、查找、插入、删除

取值:根据位置 i 获取相应位置数据元素的内容

查找:根据指定数据获取数据所在的位置

插入:插在第 i 个结点之前

删除:删除第 i 个结点

线性表的实现

线性表(容器):本质:就是一个对象数组

模板:

public class MyArrayList<E> {
	  private Object[] data; // 保存线性表数据的数组
	  private int capacity; // 线性表目前的容量
	  private int size; // 线性表的元素个数
	 
	  /**
	   * 初始化未声明大小,声明为10
	   */
	  public MyArrayList() {
	    this(10);
	  }
	 
	  /**
	   * 初始化线性表,声明数组的大小
	   * @param initSize 线性表的初始化大小
	   */
	  public MyArrayList(int initSize) {
	    if (initSize >= 0) {
	     data = new Object[initSize];
	     capacity = initSize;
	     size = 0;
	    } else {
	     throw new RuntimeException("初始化大小不能小于0: " + initSize);
	    }
	  }
	 
	  /**
	   * 判断当前线性表是否为空 
	   * @return
	   */
	  public boolean isEmpty() {
	    if (size > 0) {
	     return false;
	    } else {
	     return true;
	    }
	  }
	 
	  /**
	   * 返回当前线性表的大小
	   * @return
	   */
	  public int capacity() {
	    return size;
	  }
	 
	  /**
	   * 清空当前线性表
	   */
	  public void empty() {
	    data = null;
	    capacity = 0;
	    size = 0;
	  }
	 
	  /**
	   * 末位添加新元素 
	   * @param e 元素e
	   */
	  public boolean add(E e) {
	    validatecp();
	    data[size] = e;
	    size++;
	    return true;
	  }
	 
	  /**
	   * 判断是否超出容量,即size是否超出capacity,如果超出则扩容
	   */
	  private void validatecp() {
	    if (size == capacity) {
	     capacity *= 2;
	     Object[] temp = new Object[capacity];
	     for (int i = 0; i < size; i++) {
	       temp[i] = data[i];
	     }
	     data = temp;
	    }
	  }
	 
	  /**
	   * 判断下标是否在正常范围内 
	   * @param index 接收的下标参数
	   */
	  private void validateindex(int index) {
	    if (index < 0 || index > size) {
	     throw new RuntimeException("无效的下标: " + index);
	    }
	  }
	 
	  /**
	   * 取得某个位置元素 
	   * @param index 下标参数
	   * @return
	   */
	 
	  public E getElement(int index) {
	    validateindex(index);
	    return (E) data[index];
	  }
	 
	  /**
	   * 在指定的位置插入元素 
	   * @param index 元素的插入位置
	   * @param e 元素
	   * @return
	   */
	  public boolean insert(int index, E e) {
	    validateindex(index);
	    validatecp();
	    for (int i = size; i > index; i--) {
	     data[i] = data[i - 1];
	    }
	    data[index] = e;
	    size++;
	    return true;
	  }
	 
	  /**
	   * 删除指定位置的元素 
	   * @param index 待删除元素下标
	   * @return
	   */
	  public boolean delete(int index) {
	    validateindex(index);
	    for (int i = index; i < size; i++) {
	     data[i] = data[i + 1];
	    }
	    data[size - 1] = null;
	    size--;
	    return true;
	  }
	 
	  @Override
	  public String toString() {
	    String str = "[ ";
	    for (Object e : data) {
	     if (e != null) {
	       str = str + e + " ";
	     }
	    }
	    str = str + "]";
	    return str;
	  }
	}

自己创建一个线性表:

/**
 * 
 * @author Admin
 *
 */
public class LanqiaoArrayList {
	/*
	 * 保存元素
	 */
	private Object[] data;
	/*
	 *线性表的容量
	 */
	private int capacity;
	/*
	 *线性表中元素的个数 
	 */
	private int size;
	
	/*
	 * 不指定线性表的容量,采用默认值
	 */
	public LanqiaoArrayList() {
		
		data = new Object[10];
		capacity = 10;
		size = 0 ;
	}
	/**
	 * 指定线性表的容量
	 * @param initCapacity 线性表容量
	 */
	public LanqiaoArrayList(int initCapacity) {
		if(initCapacity >= 0) {
			data = new Object[initCapacity];
			capacity = initCapacity;
			size = 0;
		}else {
			System.out.println("线性表的容量不能为负数:" + initCapacity);
			
		}
		
	}
	/*
	 * 获取线性表的容量
	 */
	public int getCapacity() {
		return this.capacity;
	}
	/*
	 * 获取线性表中元素的个数
	 */
	public int getSize() {
		return this.size;
	}
	/*
	 * 判断线性表是否为空
	 */
	public boolean isEmpty() {
		if(size > 0 ) {
			return false;
		}else {
			return true;
		}
	}
	
	/*
	 * 清空线性表
	 * 1 将中个数组全部删除
	 * 2 将数组中的元素全部删除
	 */
	public void clear() {
		/*data = null;
		capacity = 0;
		size = 0 ;*/
		if(size > 0 ) {
			for(int i = 0 ; i < size; i++) {
				data[i] = null;		
			}
			size  = 0 ;
		}
		
	}
	
	/*
	 * 获取某一元素
	 */
	public Object getElement(int index) {
		if(index < capacity) {
			
			return data[index];
		}else {
			System.out.println("你输入的索引超出了范围");
			return null;
		}
		
	}
	
	/*
	 * 末位添加一个元素到线性表中
	 * 如果size = capacity  告诉用户,线性表已满
	 * 如果size = capacity 实现自动扩容
	 */
	public void addElement(Object obj) {
		validatecp();
		data[size++] = obj;
	}
	/*
	 * 验证线性表的容量
	 */
	public  void validatecp(){
		if(size == capacity) {
			capacity = capacity * 2;
			Object[] newData = new Object[capacity];
			for(int i = 0 ; i < data.length;i++) {
				newData[i] = data[i];
			}
			data = newData;
			
		}
		
		
	}
	/*
	 * 删除指定的元素
	 */
	public void deleteEle(int index) {
		
		if(validateIndex(index)) {
			for (int i = index; i < size; i++) {
			
				data[i] = data[i + 1];
			}
			data[size- 1] = null;
			size-=1;
		
	}
			
}
		
	/*
	 * 判断给出的索引是否有效
	 */
	public  boolean validateIndex(int index) {
		if(index < 0 || index > size ) {
			
			System.out.println("索引无效");
			return false;
		}
		return true;
		
	}
	/*
	 * 插入一个元素到指定的位置
	 */
	public void insertEle(int index,Object ele) {
		if(validateIndex(index)) {
			validatecp();
			for(int i = size; i > index;i--) {
				data[i] = data[i - 1];
				
			}
			data[index]= ele;
			size += 1;
			
			
		}
		
	}
	
	/*
	 * 查找某一个元素:如果该元素存在,则返回元素的下标  如果不存在  则返回-1
	 */
		public int searchElE(Object obj) {
			for(int i = 0 ; i < size ; i++) {
				if(data[i] == obj && data[i].equals(obj)) {
					return i;
					
				}				
			}
			return -1;
			
		}
	
	
	
	
	public void printArrayList() {
		for(int i = 0 ; i < size; i++) {
			
			System.out.println(data[i]);
		}
		
	}
}
public class Test {
	
	public static void main(String[] args) {
	
		LanqiaoArrayList lal = new LanqiaoArrayList(5);
		System.out.println(lal.getCapacity());
		System.out.println("-------------------");
		lal.addElement(1);
		lal.addElement(2);
		lal.addElement(3);
		lal.addElement(4);
		lal.addElement(5);
		lal.addElement(6);
		lal.printArrayList();
		System.out.println("------------------");
		lal.insertEle(2, "aaaa");
		lal.printArrayList();
		System.out.println("------------");
		int i = lal.searchElE("aaaaa");
		System.out.println(i);
		
		
	}
}

顺序表的优缺点

优点:

  • 存储密度大(结点本身所占存储量/结点结构所占存储量)
  • 可以随机存取表中任一元素

缺点:

  • 在插入、删除某一元素时,需要移动大量元素
  • 浪费存储空间
  • 属于静态存储形式,数据元素的个数不能自由扩充

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java线性表的设计与实现通常有两种方式: 1. 使用数组实现线性表 数组实现线性表可以直接利用Java提供的数组数据类型。在这种实现方式线性表的元素存储在一个一维数组,可以通过下标访问和操作元素。但是,由于数组长度固定,插入和删除元素时需要移动大量的数据,所以插入和删除操作的效率相对较低。 2. 使用链表实现线性表 链表实现线性表可以通过定义节点类来实现。每个节点包含数据和指向下一个节点的指针,通过链接节点来组成链表。由于链表的长度不固定,插入和删除元素时只需要修改指针的指向,因此插入和删除操作的效率较高。但是,由于需要遍历整个链表才能访问元素,因此访问操作的效率相对较低。 总的来说,数组实现线性表适用于元素数量较少,访问操作频繁的场景,而链表实现线性表适用于元素数量较多,插入和删除操作频繁的场景。具体实现要根据具体的业务场景和需求来选择。 ### 回答2: 线性表是最基本的数据结构之一,它是由若干个数据元素构成的有限序列,其特点是元素之间仅存在一对一的关系。Java作为一种面向对象的编程语言,对于线性表的设计与实现也提供了许多灵活的方式。 首先,在Java可以使用数组来实现线性表,这种方法最简单直接。数组可以直接定义一个具有固定大小的容器来存储数据元素。但是,数组的缺点是不能根据需要动态调整大小,因此在实际运用,无法满足一些要求。此外,数组还需要占用一定的内存空间,如果数据元素很多,可能会导致内存不足。 其次,使用链式结构实现线性表Java另一种常见的方式。链式结构的特点是可以动态调整大小,因为链表每个节点的空间只是在需要时分配的。Java可以使用Node类来实现链表,该类包含一个数据元素和一个指向下一个节点的引用。操作链式结构时,需要注意节点的指向和数据元素的赋值,并且需要特别处理边界条件。 Java还提供了其他一些常用的线性表实现方式,如栈和队列等。栈是一种后进先出的数据结构,可以用数组或链式结构实现,主要操作是push和pop。队列是一种先进先出的数据结构,也可以用数组或链式结构实现,主要操作是enqueue和dequeue。 总之,Java提供了多种数据结构实现线性表,并且这些数据结构之间也可以互相转换。在实际运用,需要根据具体情况选择适合的方法。同时,需要注意数据元素的类型和边界条件的处理,以确保程序的稳定性和可靠性。 ### 回答3: Java数据结构线性表是一种基本数据结构,通过这种数据结构可以存储一组按一定顺序排列的元素。线性表主要包括数组和链表两种实现方式,它们的设计与实现都有所不同。 对于数组实现线性表,需要定义一个数组来存储元素,同时还需要记录元素的个数、当前元素的位置等信息。具体实现时,可以通过定义一个类来完成,该类包含了数组元素、数组长度等属性,还需要定义一些操作方法,如向线性表添加元素、获取元素、删除元素等。 对于链表实现线性表,需要定义一个节点类来表示元素,同时还需要一个指针来连接不同节点。具体实现时,可以通过定义一个链表类来完成,该类包含了头结点、尾节点、链表长度等属性,还需要定义一些操作方法,如向链表添加元素、获取元素、删除元素等。 在设计和实现线性表时,需要注意以下几点: 1. 定义合适的数据结构,如数组、链表等。 2. 统一数据类型,如规定线性表只存储整数、字符串等类型的数据。 3. 考虑数据的大小和类型,以及不同操作的时间复杂度。 4. 良好的命名规范和注释,以方便代码阅读和维护。 在实际使用线性表经常被用来解决一些常见的问题,如实现队列、栈等高级数据结构,查询和处理大量数据等。因此,对于Java程序员来说,掌握线性表的设计和实现方法是非常重要的,它不仅有助于提高代码效率,还能使开发更加方便和快捷。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值