线性表
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));
}
}
分享到:
相关推荐
3. **列表、元组、字典与集合**:这些是Python的主要数据结构,列表是可变序列,元组是不可变序列,字典是键值对的集合,集合则是一组不重复的元素。理解它们的特点和操作方法,如索引、切片、增删改查、迭代等。 4...
数据结构--学习笔记--入门必看【建议收藏】
2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据结构——学习笔记——入门必看【建议收藏】2024数据...
2. 输入数据:Apollo学习笔记-感知简介中,输入数据包括捕获图像、预处理、特征提取等步骤。 捕获图像:使用摄像头或其他传感器捕获图像。 预处理:调整大小、旋转图像、色彩空间转换(灰度)等步骤。 特征提取:...
"算法数据结构学习笔记-C语言.zip"这个压缩包很可能是为大学生提供的一份详细的学习资源,涵盖了数据结构的基础知识、常见算法以及相关的实践练习。 首先,我们要理解数据结构的基本概念,如数组、链表、栈、队列、...
数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 数据结构(C语言描述)学习笔记、学习文档 ...
《数据结构学习笔记-第八篇》主要探讨了树与森林的理论与应用。 首先,我们要理解树的基本概念。树是一种由n(n>=1)个有限节点组成的数据结构,这些节点通过一对一的关系连接,形成层次结构。每个节点包含一个数据...
"数据结构看书笔记---lazyfennec整理精选"是一份由lazyfennec精心整理的数据结构学习资料,旨在帮助学习者深入理解并掌握这一领域的重要概念和算法。 笔记可能涵盖了以下几个关键知识点: 1. **数组**:数组是最...
本学习笔记将聚焦于单链表的概念、操作以及在VS2022环境下如何实现。 单链表是一种线性数据结构,其元素(节点)不是在内存中连续存储的,而是通过指针链接在一起。每个节点包含两部分:数据域和指针域。数据域用于...
3.数据结构:数据之间的相互关系,即数据的组织形式。它包括:1)数据的逻辑结构,从逻辑关系上描述数据,与数据存储无关,独立于计算机; 2)数据的存储结构,是逻辑结构用计算机语言的实现,依赖于计算机语言。 3)数据...
数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解数据结构学习笔记基数排序 详细讲解...
3. **切片与映射**:讲解Go语言特有的切片(slice)和映射(map)数据结构,以及它们在实际开发中的高效利用。 4. **指针与内存管理**:深入解析Go中的指针操作,包括指针类型、指针变量以及内存管理机制,如垃圾...
- 内建高级数据结构:Python提供了列表、字典、集合和元组等丰富数据结构。 - 支持模块和包:Python拥有庞大而强大的标准库和第三方库,方便代码复用和模块化开发。 - 可移植性:Python能在多种平台上运行,包括...
2. **线性数据结构**:线性数据结构如数组、链表、栈和队列是学习的基础。笔记可能详细讲解了数组的连续存储和随机访问特性,链表的动态内存分配和指针操作,栈的“后进先出”(LIFO)原则,以及队列的“先进先出”...
### Java数据结构与算法学习笔记知识点总结 #### 一、数据结构概述 数据结构是对数据的一种组织形式,它决定了数据的存储方式以及处理数据的方法。常见的数据结构包括但不限于数组、链表、栈、队列、二叉树、图等...
### Java数据结构学习笔记知识点详解 #### 一、数据结构与算法基础 1. **数据结构定义** - 数据结构是一门研究组织数据方式的学科,它与编程语言紧密相关,是实现高效程序设计的基础。 - 在软件开发中,合理选择...
3. **列表、元组和字典**:这些是Python中的主要数据结构。列表支持动态添加、删除元素,元组不可变,而字典则是一种键值对存储结构,适用于快速查找。 4. **函数和模块**:学习如何定义和调用函数,理解函数参数的...