`

线性表的Java实现--顺序存储

阅读更多

线性表的Java实现--顺序存储

 线性表(Linear List)是由n(n≥0)个数据元素(结点)a[0],a[1],a[2]…,a[n-1]组成的有限序列

 

其中:

  • 数据元素的个数n定义为表的长度 = "list".length() ("list".length() = 0(表里没有一个元素)时称为空表)
  • 将非空的线性表(n>=0)记作:(a[0],a[1],a[2],…,a[n-1])
  • 数据元素a[i](0≤i≤n-1)只是个抽象符号,其具体含义在不同情况下可以不同

        一个数据元素可以由若干个数据项组成。数据元素称为记录,含有大量记录的线性表又称为文件。这种结构具有下列特点:

线性结构的基本特征为:
1.集合中必存在唯一的一个“第一元素”;
2.集合中必存在唯一的一个 “最后元素” ;
3.除最后一个元素之外,均有 唯一的后继(后件);
4.除第一个元素之外,均有 唯一的前驱(前件)。

 简单结束线性表的基础知识后,下面分别实现顺序存储的线性表和链式存储的线性表。

 

下面的程序分别实现了顺序存储线性表的初始化、获取线性表长度、获取指定索引处元素、根据值查找、插入、删除、清空等操作。

 

顺序存储插入操作:

 



 

顺序存储删除操作:

 

 

顺序存储的Java实现

package com.liuhao.algorithm;

import java.util.Arrays;

public class SequenceList<T> {
	private final int DEFAULT_SIZE = 16;

	private int capacity;// 保存数组的长度

	private Object[] elementData; // 定义一个数组,用于保存顺序线性表

	private int size = 0;// 保存顺序线性表中当前元素的个数

	// 以默认长度创建空的线性表
	public SequenceList() {
		capacity = DEFAULT_SIZE;
		elementData = new Object[capacity];
	}

	// 以一个初始化元素创建顺序线性表
	public SequenceList(T element) {
		this();
		elementData[0] = element;
		size++;
	}

	/**
	 * 以指定长度来创建
	 * 
	 * @param element
	 *            指定的第一个元素
	 * @param initSize
	 *            指定的长度
	 */
	public SequenceList(T element, int initSize) {
		capacity = 1;

		// 把capacity设为大于initSize的最小的2的n次方
		while (capacity < initSize) {
			capacity <<= 1;
		}

		elementData = new Object[capacity];
		elementData[0] = element;
		size++;
	}

	// 获取线性表的大小
	public int length() {
		return size;
	}

	// 获取索引处i的元素
	public T get(int i) {
		if (i < 0 || i > size - 1) {
			throw new IndexOutOfBoundsException("索引超出线性表范围");
		}

		return (T) elementData[i];
	}

	// 根据元素查找在线性表中的位置
	public int indexOf(T element) {
		for (int i = 0; i < size; i++) {
			if (elementData[i].equals(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);
		
		elementData[index] = element;
		
		size++;

	}
	
	//在线性表的末端添加一个元素
	public void add(T element){
		insert(element, size);
	}

	private void ensureCapacity(int minCapacity) {

		// 如果数组的原有长度小于目前所需的长度
		if (minCapacity > capacity) {

			// 不断的将capacity*2,直到capacity 大于minCapacity
			while (capacity < minCapacity) {
				capacity <<= 1;
			}

			elementData = Arrays.copyOf(elementData, capacity);
		}
	}
	
	//删除指定索引处的元素
	public T delete(int index){
		if(index < 0 || index > size-1){
			throw new IndexOutOfBoundsException("索引超出线性表范围");
		}
		
		T oldValue = (T) elementData[index];
		
		int numMoved = size - index - 1;
		if(numMoved > 0){
			System.arraycopy(elementData, index+1, elementData, index, numMoved);
		}
		
		elementData[--size] = null;
		
		return oldValue;
	}
	
	//删除最后一个元素
	public T remove(){
		return delete(size-1);
	}
	
	//盘对线性表是否为空
	public boolean isEmpty(){
		return size == 0;
	}
	
	//清空线性表
	public void clear(){
		//将所有元素置为null
		Arrays.fill(elementData, null);
		size = 0;
	}
	
	public String toString(){
		if(size == 0){
			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();
		}
	}
}

 

测试代码:

package com.liuhao.test;

import org.junit.Test;

import com.liuhao.algorithm.SequenceList;

public class SequeceListTest {

	@Test
	public void test() {
		SequenceList<String> sList = new SequenceList<String>();
		
		//添加元素
		sList.add("我");
		sList.add("is");
		sList.add("hehe");
		System.out.println(sList);
		
		//指定位置插入
		sList.insert("xxx", 3);
		System.out.println(sList);
		
		//指定位置删除
		sList.delete(2);
		System.out.println(sList);
		
		//获取元素位置
		System.out.println("“我”在其中的位置:" + sList.indexOf("我"));
		
		//清空
		sList.clear();
		System.out.println(sList);
	}

}

 

 

代码获取地址:https://github.com/liuhao123/JavaMore.git

  • 大小: 18.7 KB
  • 大小: 17.4 KB
分享到:
评论

相关推荐

    线性表实现源码-java

    在Java中实现线性表,通常会涉及到两种常见的存储方式:顺序存储和链式存储。 一、顺序存储结构 1. 数组实现:线性表的顺序存储是最直观的方式,即使用数组来存储元素。数组的特点是访问速度快,但插入和删除操作...

    自定义顺序存储结构线性表--java语言描述

    在本主题中,我们将探讨如何使用Java语言实现自定义的顺序存储结构线性表。顺序存储结构是线性表的一种常见实现方式,其中元素在内存中是连续存放的,便于进行索引和访问。 Java作为一种面向对象的语言,我们可以...

    java实现线性表

    在给定的压缩包中,我们有两个.java文件:SeqList.java和LList.java,分别代表顺序表和链表两种线性表的实现方式。 1. **顺序表(SeqList.java)** - 顺序表是一种物理存储上连续的线性表,它的元素在内存中按顺序...

    线性表-顺序实现

    在计算机科学中,线性表的顺序实现是指在线性表中的元素按其逻辑顺序存储在一块连续的内存区域中,这种实现方式通常称为顺序表。下面将详细介绍线性表的顺序实现及其相关操作。 首先,线性表的顺序实现涉及到数组...

    数据结构复习(1)---线性表的顺序存储结构及实现

    4. 排序操作:常见的排序算法如冒泡排序、插入排序、选择排序等都可以在顺序存储的线性表上高效实现。 四、优缺点 优点: - 访问速度快,随机访问效率高。 - 空间利用率高,无需额外的指向下一个元素的指针。 缺点...

    数据结构(Java版)-线性表的实现与应用完整版.doc

    顺序表是一种基本的线性表结构,它的特点是将数据元素存储在连续的存储单元中。通过实现顺序表的基本操作,可以熟练掌握顺序表的使用。 顺序表的基本操作 顺序表的基本操作包括: 1. 判断线性表是否空:isEmpty()...

    顺序线性表的java实现代码

    顺序存储结构线性表的java实现代码,要在jdk1.6以上环境下运行

    用链表实现线性表java

    本篇将深入探讨如何用链表来实现线性表,并通过提供的`ChainList.java`和`ListInterface.java`文件来理解其实现细节。 首先,线性表具有顺序访问的特点,其元素可以通过索引进行访问。链表是一种非连续存储结构,每...

    Java 实现线性表

    在Java中,我们通常通过两种方式来实现线性表:数组和链表。下面将详细讨论这两种实现方式及其操作。 一、数组实现线性表 1. **数组定义**:在Java中,数组是最基本的线性数据结构,可以存储同一类型的元素。通过...

    线性表顺序存储的插入操作java.java

    线性表顺序存储的插入操作java.java

    算法-理论基础- 线性表- 顺序表(包含源程序).rar

    线性表的顺序存储结构,也称为顺序表,是最简单也是最直观的数据结构之一。它将表中的所有元素存储在一个固定的数组中,元素之间的前后关系通过它们在数组中的相对位置来体现。顺序表的优点在于访问速度快,因为元素...

    线性表,单链表,栈 java实现

    在Java中,线性表可以使用数组或链表来实现。数组实现简单,但插入和删除操作效率较低;链表则可以灵活地进行插入和删除,但需要额外的存储空间来保存指针。 **单链表** 是线性表的一种链式存储结构,每个节点包含...

    数据结构实验报告-实验:1线性表的顺序存储和操作实现.doc

    本实验报告的主要目的是为了实现线性表的顺序存储和操作,使用 Java 语言编写程序来实现顺序存储线性表的功能。实验中,我们定义了一个名为 `SequenceList` 的类,该类实现了 `List` 接口,提供了对顺序存储线性表的...

    数据结构线性表的各种实现

    在Java中,可以使用ArrayList类作为顺序数组实现线性表的基础。 3. **链表实现**:链表是由节点(每个节点包含数据和指向下一个节点的引用)组成的数据结构。相比于数组,链表不需要连续的内存空间,插入和删除操作...

    数据结构与算法分析--线性表实现

    在本资料中,我们将深入探讨线性表的实现,主要关注在Java环境下的插入和删除操作。 首先,我们来看"SqList.java"文件,这通常代表顺序表(Sequential List)的实现。顺序表是线性表的一种静态存储方式,它将所有...

    漫话数据结构-线性表的顺序存储.pptx

    总结来说,线性表是一种基本的数据结构,顺序存储则是实现线性表的一种常见方式,尤其适用于需要快速访问元素的场景。理解并熟练掌握线性表的顺序存储及其基本操作对于学习和应用数据结构至关重要。

    数据结构工程----线性表的实现

    1.顺序存储 顺序表,使用数组实现,一组地址连续的存储单元,数组大小有两种方式指定,一是静态分配,二是动态扩展。 注:线性表从1开始,而数组从0开始。 优点:随机访问特性,查找O(1)时间,存储密度高;逻辑...

    java基础数据结构-线性表

    1. **顺序存储结构**:将线性表中的元素存放在一段连续的内存空间中。这种方式便于快速访问元素,但插入和删除操作较慢。 2. **链式存储结构**:通过节点之间的指针连接来表示线性表。每个节点包含数据域和指向下一...

    JAVA线性表JAVA线性表JAVA线性表

    在Java中,线性表的实现通常包括两种主要方式:顺序表和链表。 **2.1 线性表的抽象数据类型** 线性表的抽象数据类型(Abstract Data Type, ADT)定义了线性表的基本操作。在Java中,我们可以定义一个名为`LList`的...

Global site tag (gtag.js) - Google Analytics