`
firesaijj
  • 浏览: 8974 次
  • 性别: Icon_minigender_1
  • 来自: 四川
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据结构学习---线性表的数组实现LIstArray

阅读更多
  线性表的数组实现,其内部存放数据的实际上就是一个可变容量的数组,大家都知道数组的特性,获取数组中I的数据的时间为常数,所以做查询非常快。
package taxus.list;

public class ListArray implements List{
	
	private final int LEN = 5;
	
	private int size;
	
	private Object[] elements;
	
	private Strategy strategy;

	public ListArray(){
		this(new DefaultStrategy());
	}
	
	public ListArray(Strategy strategy){
		this.strategy = strategy;
		size = 0;
		elements = new Object[LEN];
	}
	
	
	public int getSize() {
		return size;
	}

	
	public boolean isEmpty() {
		return size == 0;
	}

	
	public boolean contains(Object e) {
		for (int i = 0; i < size; i++) {
			if (strategy.equal(elements[i], e)) {
				return true;
			}
		}
		return false;
	}

	
	public int indexOf(Object e) {
		for (int i = 0; i < size; i++) {
			if (strategy.equal(elements[i], e)) {
				return i;
			}
		}
		return -1;
	}

	
	public void insert(int i, Object e) throws OutOfBoundaryException {
		if (i < 0 || i > size) {
			throw new OutOfBoundaryException("指定的插入序号越界,Size:" + size + " Index:" + i);
		}
		if (i >= elements.length) {
			expandSpace();
		}
		for (int j = size; j > i; j--) {
			elements[j] = elements[j-1];
		}
		elements[i] = e;
		size++;
		return;
	}
	
	private void expandSpace(){
		Object[] a = new Object[elements.length * 2];
		for (int i = 0; i < elements.length; i++) {
			a[i] = elements[i];
		}
		elements = a;
	}

	
	public boolean insertBefore(Object obj, Object e) {
		int i = indexOf(obj);
		if (i < 0) {
			return false;
		}
		insert(i, e);
		return true;
	}

	
	public boolean insertAfter(Object obj, Object e) {
		int i = indexOf(obj);
		if (i < 0) {
			return false;
		}
		insert(i + 1, e);
		return true;
	}

	/**
	 * size length 
	 * size实际大小
	 * length 创建的空间大小
	 * length >= size, 插入时size范围内安全,超出size有可能就超越length,删除时删除size范围内,
	 */
	public Object remove(int i) throws OutOfBoundaryException {
		if (i < 0 || i > size) {
			throw new OutOfBoundaryException("指定的插入序号越界,Size:" + size + " Index:" + i);
		}
		Object obj = elements[i];
		for (int j = i; j < size - 1; j++) {
			elements[j] = elements[j];
		}
		elements[--size] = null;
		return obj;
	}

	
	public boolean remove(Object e) {
		int i = indexOf(e);
		if (i < 0) {
			return false;
		}
		remove(i);
		--size;
		return true;
	}

	
	public Object replace(int i, Object e) throws OutOfBoundaryException {
		if (i < 0 || i > size) {
			throw new OutOfBoundaryException("指定的插入序号越界,Size:" + size + " Index:" + i);
		}
		Object old = elements[i];
		elements[i] = e;
		return old;
	}

	
	public Object get(int i) throws OutOfBoundaryException {
		if (i < 0 || i > size) {
			throw new OutOfBoundaryException("指定的插入序号越界,Size:" + size + " Index:" + i);
		}
		return elements[i];
	}
	
	public int getElementsLength(){
		return elements.length;
	}
	
}


  在ArrayList类中一共有4个成员变量,其中elements数组及size用于存储线性表中的数据元素及元素个数,strategy完成线性表中原色的比较操作策略;LEN是elements的初始默认大小,数组的大小再后续的插入操作中可以发生变化。
  算法getSize(), isEmpty(), replate(int i, Object e),get(i)的时间复杂度为1,由于数组的随机存取特性,因此,获取线性表中序号为i的原色或对其进行替换均可在常数时间内完成,通过size可以直接判断出线性表中元素个数和线性表是否为空。
  算法contains(Object e), indexOf(Object e)主要是查找线性表中的某个元素,查找会出现不成功的情况,在整个查找过程中会比较接近一半的元素。
  算法insert(int i, Object e), remove(i)主要按照序号来完成线性表的插入与删除操作,时间复杂度上面已经说明,为常数,除此之外在找到元素以后要进行相应操作会移动一半的数据元素,特别的在插入过程中还会出现空间扩展,采用平均时间分析后,算法消耗的时间为n/2。
  算法insertBefore(Object obj, Object e),insertAfter(Object obj, Object e), remove(Object e),按照线性表中特定的元素来完成元素的插入,删除,操作,此时算法分别为先在线性表中找到对应的数据元素,然后在进行相应操作。在使用数组实现是运行时间为n。
  除此之外我们还可以看到两个东西size和数组的elements.lengh,在此结构中要注意size <= elements.lengh,length为开辟的存储空间,size为空间中实际存放的元素数量,开辟了空间不一定要存放元素。
分享到:
评论

相关推荐

    leetcode摇摆-data-structure:java数据结构

    此项目是基于java语言的关于数据结构的代码实现,包含所有经典数据结构算法,并且注释完善,非常适合了解和学习数据结构。另外包含了一个联系人存储工具(phonebook),它由swing展示,并应用了数据结构算法的相关概念...

    leetcode摇摆-my-Java-DS:我的Java-DS

    此项目是基于java语言的关于数据结构的代码实现,包含所有经典数据结构算法,并且注释完善,非常适合了解和学习数据结构。另外包含了一个联系人存储工具(phonebook),它由swing展示,并应用了数据结构算法的相关概念...

    浙江大学数据结构和算法课件和源程序

    数据结构3线性表2.ppt 数据结构4堆栈与队列1.ppt 数据结构5堆栈与队列2.ppt 数据结构6串.ppt 数据结构7数组1.ppt 数据结构8数组2.ppt 数据结构9树1.ppt 数据结构A树2.ppt 数据结构B树3.ppt 数据结构C图1....

    数据结构算法与应用-C++语言描述

    本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之算法、分枝定界算法等多种算法设计方法,为数据结构与算法的继续学习和研究奠定了一...

    php线性表顺序存储实现代码(增删查改)

    php /* *文件名:linearList.php * 功能:数据结构线性表的顺序存储实现 * author:黎锦焕 * @copyright:www.drw1314.com */ class linearList { private $arr; private $length; const MAXSIZE=100; /* *构造函数,...

    常用的数据结构.doc

    常用数据结构 数组 (Array) 在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集 合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多...

    数据结构与算法的知识点

    链表(Linked List):链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。 树(Tree):树是典型的非线性结构,它是包括,2 个结点的有穷集合 K。 图(Graph):图...

    数据结构算法与应用-C__语言描述

    本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之算法、分枝定界算法等多种算法设计方法,为数据结构与算法的继续学习和研究奠定了一...

    数据结构与算法:C++描述

    本书在简要回顾了基本的C++ 程序设计概念的基础上,全面系统地介绍了队列、堆栈、树、图等基本数据结构,以及贪婪算法、分而治之算法、分枝定界算法等多种算法设计方法,为数据结构与算法的继续学习和研究奠定了一...

    《数据结构 1800题》

    9. 数据结构的抽象操作的定义与具体实现有关。( )【华南理工大学 2002 一、1(1分)】 10. 在顺序存储结构中,有时也存储数据结构中元素之间的关系。( )【华南理工大学 2002 一、2 (1分)】 11. 顺序存储方式的...

    数据结构算法与应用(C++语言描述).rar

    第二部分 数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类ChainNode 和Chain 86 3.4.2 ...

    数据结构算法与应用-C C++语言描述

    第二部分 数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类ChainNode 和Chain 86 3.4.2 ...

    数据结构、算法与应用--C++语言描述

    第二部分 数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类ChainNode 和Chain 86 3.4.2 ...

    数据结构算法与应用-C++语言描述.rar

    数据结构算法与应用-C++语言描述 目 录 译者序 前言 第一部分 预备知识 第1章 C++程序设计 1 1.1 引言 1 1.2 函数与参数 2 1.2.1 传值参数 2 1.2.2 模板函数 3 1.2.3 引用参数 3 1.2.4 常量引用参数 4 ...

    数据结构算法与应用 很详细的,数据结构算法全集 这个是你想找的

    数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类...

    数据结构(C语言描述)

    第二部分 数据结构 第3章 数据描述 75 3.1 引言 75 3.2 线性表 76 3.3 公式化描述 77 3.3.1 基本概念 77 3.3.2 异常类NoMem 79 3.3.3 操作 79 3.3.4 评价 83 3.4 链表描述 86 3.4.1 类ChainNode 和Chain 86 3.4.2 ...

Global site tag (gtag.js) - Google Analytics