`
sxw7362693
  • 浏览: 60703 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

学习笔记--数据结构

阅读更多

线性表

1、ADT

/**
 * 
 * 线性表ADT
 * @author sxw
 *
 */
public interface List {
	
	/**
	 * 得到数据元素的个数。
	 * @return 返回线性表的大小
	 */
	public int getSize();
	
	/**
	 * 判断线性表是否为空
	 * @return 如果线性表为空返回true,否则返回false。
	 */
	public boolean isEmpty();
	
	/**
	 * 判断线性表是否包含数据元素e
	 * @param e 数据元素
	 * @return 如果线性表包含e返回true,否则返回false。
	 */
	public boolean contains(Object e);
	
	/**
	 * 定位数据元素e在线性表中的位置
	 * @param e
	 * @return 返回数据元素e在线性表中的序号,如果找不到返回-1。
	 */
	public int indexOf(Object e);
	
	/**
	 * 将数据元素e插入到线性表中index位置
	 * @param index
	 * @param e
	 * @throws OutOfBoundaryException 如果index超出线性表的容量,抛出此异常
	 */
	public void insert(int index, Object e) throws OutOfBoundaryException;
	
	/**
	 * 将数据元素e插入到元素obj之前
	 * @param obj
	 * @param e
	 * @return 是否插入成功
	 */
	public boolean insertBefore(Object obj, Object e);
	
	/**
	 * 将数据元素e插入到元素obj之后
	 * @param obj
	 * @param e
	 * @return 是否插入成功
	 */
	public boolean insertAfter(Object obj, Object e);
	
	/**
	 * 删除线性表中序号为i的元素,并返回之
	 * @param index
	 * @return 返回删除的数据元素
	 * @throws OutOfBoundaryException 如果index超界,则抛出此异常。
	 */
	public Object remove(int index) throws OutOfBoundaryException;
	
	/**
	 * 删除线性表中第一个与e相同的元素
	 * @param e
	 * @return 是否删除成功
	 */
	public boolean remove(Object e);
	
	/**
	 * 替换线性表中序号为i的数据元素为e
	 * @param index
	 * @param e
	 * @return 返回原数据元素
	 * @throws OutOfBoundaryException 如果index超界,则抛出此异常。
	 */
	public Object replace(int index, Object e) throws OutOfBoundaryException;
	
	/**
	 * 取得序号index的数据元素
	 * @param index
	 * @return 返回线性表中序号为index的数据元素
	 * @throws OutOfBoundaryException 如果index超界,则抛出此异常。
	 */
	public Object get(int index) throws OutOfBoundaryException;
}

 2、线性表的顺序映像

顺序映像采用数组实现

线性表的顺序存储结构是一种随机存取的存储结构。

/**
 * 线性表顺序映像采用数组实现
 * @author sxw
 *
 */
public class ListArray implements List
{
	private static final int LEN = 10; // 数组的默认大小
	private Strategy strategy; // 数据元素比较策略
	private int size; // 线性表中数据元素的个数
	private Object[] elements; // 数据元素数组

	public ListArray()
	{
		this(new DefaultStrategy());
	}

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

	// 返回线性表的大小,即数据元素的个数。
	public int getSize()
	{
		return size;
	}

	// 如果线性表为空返回true,否则返回false。
	public boolean isEmpty()
	{
		return size == 0;
	}

	// 判断线性表是否包含数据元素e
	public boolean contains(Object e)
	{
		// for (int i = 0; i < size; i++)
		// if (strategy.equal(e, elements[i])) return true;
		// return false;
		return indexOf(e) > 0;
	}

	// 返回数据元素e在线性表中的序号
	public int indexOf(Object e)
	{
		if (e == null)
		{
			for (int i = 0; i < size; i++)
			{
				if (elements[i] == null) return i;
			}
		}
		for (int i = 0; i < size; i++)
			if (strategy.equal(e, elements[i])) return i;
		return -1;
	}

	// 将数据元素e插入到线性表中i号位置
	public void insert(int index, Object e) throws OutOfBoundaryException
	{
		if (index < 0 || index > size) throw new OutOfBoundaryException("Index: "+index+", Size: "+size);
		
//		if (size >= elements.length) ensureCapacity();
		// 数组扩容
		ensureCapacity(size + 1);
		
		
		for (int j = size; j > index; j--)
		{
			elements[j] = elements[j - 1];
		}
		// 	System.arraycopy(elementData, index, elementData, index + 1, size - index);
		
		elements[index] = e;
		size++;
		return;
	}

	private void ensureCapacity(int minCapacity)
	{
//		Object[] a = new Object[elements.length * 2];
//		for (int i = 0; i < elements.length; i++)
//			a[i] = elements[i];
//		elements = a;
		
		int oldCapacity = elements.length;
		if (minCapacity > oldCapacity)
		{
			// increase strategy
			int newCapacity = (oldCapacity * 3) / 2 + 1;
			if (newCapacity < minCapacity) 
			{
				newCapacity = minCapacity;
			}
			// minCapacity is usually close to size, so this is a win:
			elements = Arrays.copyOf(elements, newCapacity);
		}
	}

	// 将数据元素e插入到元素obj之前
	public boolean insertBefore(Object obj, Object e)
	{
		int i = indexOf(obj);
		if (i < 0) return false;
		insert(i, e);
		return true;
	}

	// 将数据元素e插入到元素obj之后
	public boolean insertAfter(Object obj, Object e)
	{
		int i = indexOf(obj);
		if (i < 0) return false;
		insert(i + 1, e);
		return true;
	}

	// 删除线性表中序号为i的元素,并返回之
	public Object remove(int index) throws OutOfBoundaryException
	{
		if (index < 0 || index >= size) throw new OutOfBoundaryException("Index: "+index+", Size: "+size);
		Object obj = elements[index];
		for (int j = index; j < size - 1; j++)
			elements[j] = elements[j + 1];
		elements[--size] = null;
		return obj;
	}

	// 删除线性表中第一个与e相同的元素
	public boolean remove(Object e)
	{
		int i = indexOf(e);
		if (i < 0) return false;
		remove(i);
		return true;
	}

	// 替换线性表中序号为i的数据元素为e,返回原数据元素
	public Object replace(int index, Object e) throws OutOfBoundaryException
	{
		if (index < 0 || index >= size) throw new OutOfBoundaryException("Index: "+index+", Size: "+size);
		Object obj = elements[index];
		elements[index] = e;
		return obj;
	}

	// 返回线性表中序号为i的数据元素
	public Object get(int index) throws OutOfBoundaryException
	{
		if (index < 0 || index >= size) throw new OutOfBoundaryException("Index: "+index+", Size: "+size);
		return elements[index];
	}
}

 3、分析

      i.插入

         首先过滤异常,如果传入参数超界,抛出异常

         数组扩容,调用ensureCapacity函数

         将index后的元素向后移动,将index位置赋值插入

         数组长度增1

     ii.删除

       首先增加程序健壮性,过滤异常

       指定删除的index位置元素后的元素前移,

      之后设置数组最后一个元素为null,让gc去回收,并size减1

      返回删除的元素

 

4、测试用例

/**
 * @author sxw
 * 
 */
public class ListArrayTest
{

	private static People people;
	private List list;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception
	{
		list = new ListArray();
		people = new People();
		insertToList(list);
	}

	private static void insertToList(List l)
	{
		for (int j = 0; j < 9; j++)
		{
			l.insert(j, new People("People" + " " + j, String.valueOf(j)));
		}
		l.insert(9, people);
	}

	/**
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception
	{
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#getSize()}.
	 */
	@Test
	public final void testGetSize()
	{
		Assert.isTrue(list.getSize() == 10);
		System.out.println(list.getSize());
//		fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#isEmpty()}.
	 */
	@Test
	public final void testIsEmpty()
	{
		Assert.isTrue(list.isEmpty() == false);
//		fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#contains(java.lang.Object)}.
	 */
	@Test
	public final void testContains()
	{
		Assert.isTrue(list.contains(people));
//		fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#indexOf(java.lang.Object)}.
	 */
	@Test
	public final void testIndexOf()
	{
		Assert.isTrue(list.indexOf(people) > 0);
//		fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#insert(int, java.lang.Object)}.
	 */
	@Test
	public final void testInsert()
	{
		int size = list.getSize();
		list.insert(list.getSize(), people);
		Assert.isNotNull(list.get(size));
//		fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for
	 * {@link dsa.adt.ListArray#insertBefore(java.lang.Object, java.lang.Object)}
	 * .
	 */
	@Test
	public final void testInsertBefore()
	{
		int size = list.getSize();
		Object obj = new Object();
		list.insertBefore(people, obj);
		Assert.isTrue(list.get(size - 1) == obj);
//		fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for
	 * {@link dsa.adt.ListArray#insertAfter(java.lang.Object, java.lang.Object)}
	 * .
	 */
	@Test
	public final void testInsertAfter()
	{
		int size = list.getSize();
		Object obj = new Object();
		list.insertAfter(people, obj);
		Assert.isTrue(list.get(size) == obj);
//		fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#remove(int)}.
	 */
	@Test
	public final void testRemoveInt()
	{
		int size = list.getSize();
		list.remove(size - 1);
		Assert.isTrue(list.getSize() == size - 1);
//		fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#remove(java.lang.Object)}.
	 */
	@Test
	public final void testRemoveObject()
	{
		int size = list.getSize();
		list.remove(people);
		Assert.isTrue(list.getSize() == size - 1);
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#replace(int, java.lang.Object)}.
	 */
	@Test
	public final void testReplace()
	{
		list.replace(0, people);
		Assert.isTrue(list.get(0) == people);
	}

	/**
	 * Test method for {@link dsa.adt.ListArray#get(int)}.
	 */
	@Test
	public final void testGet()
	{
		Assert.isNotNull(list.get(0));
	}

}
 

 

 

 

分享到:
评论

相关推荐

    Python学习笔记--皮大庆.pdf.zip

    3. **列表、元组、字典与集合**:这些是Python的主要数据结构,列表是可变序列,元组是不可变序列,字典是键值对的集合,集合则是一组不重复的元素。理解它们的特点和操作方法,如索引、切片、增删改查、迭代等。 4...

    数据结构--学习笔记--入门必看【建议收藏】.txt

    数据结构--学习笔记--入门必看【建议收藏】

    2024数据结构-学习笔记-入门必看建议收藏

    2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据...

    Apollo学习笔记-感知简介

    2. 输入数据:Apollo学习笔记-感知简介中,输入数据包括捕获图像、预处理、特征提取等步骤。 捕获图像:使用摄像头或其他传感器捕获图像。 预处理:调整大小、旋转图像、色彩空间转换(灰度)等步骤。 特征提取:...

    算法数据结构学习笔记-C语言.zip

    "算法数据结构学习笔记-C语言.zip"这个压缩包很可能是为大学生提供的一份详细的学习资源,涵盖了数据结构的基础知识、常见算法以及相关的实践练习。 首先,我们要理解数据结构的基本概念,如数组、链表、栈、队列、...

    数据结构(C语言描述)学习笔记、学习文档.zip

    数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 ...

    《数据结构学习笔记-第八篇》- 树与森林

    《数据结构学习笔记-第八篇》主要探讨了树与森林的理论与应用。 首先,我们要理解树的基本概念。树是一种由n(n&gt;=1)个有限节点组成的数据结构,这些节点通过一对一的关系连接,形成层次结构。每个节点包含一个数据...

    数据结构看书笔记---lazyfennec整理精选

    "数据结构看书笔记---lazyfennec整理精选"是一份由lazyfennec精心整理的数据结构学习资料,旨在帮助学习者深入理解并掌握这一领域的重要概念和算法。 笔记可能涵盖了以下几个关键知识点: 1. **数组**:数组是最...

    数据结构学习笔记-单链表

    本学习笔记将聚焦于单链表的概念、操作以及在VS2022环境下如何实现。 单链表是一种线性数据结构,其元素(节点)不是在内存中连续存储的,而是通过指针链接在一起。每个节点包含两部分:数据域和指针域。数据域用于...

    数据结构学习笔记-数据结构“”pdf

    3.数据结构:数据之间的相互关系,即数据的组织形式。它包括:1)数据的逻辑结构,从逻辑关系上描述数据,与数据存储无关,独立于计算机; 2)数据的存储结构,是逻辑结构用计算机语言的实现,依赖于计算机语言。 3)数据...

    数据结构学习笔记基数排序 详细讲解

    数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解...

    Go学习笔记-第四版-雨痕

    3. **切片与映射**:讲解Go语言特有的切片(slice)和映射(map)数据结构,以及它们在实际开发中的高效利用。 4. **指针与内存管理**:深入解析Go中的指针操作,包括指针类型、指针变量以及内存管理机制,如垃圾...

    Python学习笔记--皮大庆

    - 内建高级数据结构:Python提供了列表、字典、集合和元组等丰富数据结构。 - 支持模块和包:Python拥有庞大而强大的标准库和第三方库,方便代码复用和模块化开发。 - 可移植性:Python能在多种平台上运行,包括...

    数据结构高分笔记part1

    2. **线性数据结构**:线性数据结构如数组、链表、栈和队列是学习的基础。笔记可能详细讲解了数组的连续存储和随机访问特性,链表的动态内存分配和指针操作,栈的“后进先出”(LIFO)原则,以及队列的“先进先出”...

    java数据结构和算法学习笔记

    ### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...

    Java数据结构学习笔记

    ### Java数据结构学习笔记知识点详解 #### 一、数据结构与算法基础 1. **数据结构定义** - 数据结构是一门研究组织数据方式的学科,它与编程语言紧密相关,是实现高效程序设计的基础。 - 在软件开发中,合理选择...

    Python学习笔记-王纯业

    3. **列表、元组和字典**:这些是Python中的主要数据结构。列表支持动态添加、删除元素,元组不可变,而字典则是一种键值对存储结构,适用于快速查找。 4. **函数和模块**:学习如何定义和调用函数,理解函数参数的...

Global site tag (gtag.js) - Google Analytics