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

顺序存储结构

    博客分类:
  • java
阅读更多
import java.util.Arrays;

/**
* <顺序存储结构>
* 
* @author  
* @version  [版本号, 2011-9-19]
* @see  [相关类/方法]
* @since  [产品/模块版本]
*/
public class SequenceList<T>{
    //初始化容量
    static final int DEFAULT_INITIAL_CAPACITY = 10;
    
    //保存数组的长度
    private int capacity;
    
    //定义一个数组,用于保存顺序线性表的元素
    private Object[] elementData;
    
    //保存顺序表中元素的当前个数
    private int size = 0;
    
    /**
     * <默认构造函数>
     */
    public SequenceList(){
        capacity = DEFAULT_INITIAL_CAPACITY;
        elementData = new Object[capacity];
    }
    
    /**
     * <以一个初始化元素创建顺序线性表>
     */
    public SequenceList(T elment){
        this();
        elementData[0] = elment;
        size++;
    }
    
    public SequenceList(T elment, int initSize){
        capacity = 1;
        //把capacity设为大于initSize的最小的2的N次方
        while (capacity < initSize){
            capacity <<= 1;
        }
        elementData = new Object[capacity];
        elementData[0] = elment;
        size++;
    }
    
    /**
     * <获取顺序线性表的长度>
     * @return [参数说明]
     * 
     * @return int [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public int length(){
        return size;
    }
    
    /**
     * <获取顺序线性表中索引为i处得元素>
     * @param i
     * @return [参数说明]
     * 
     * @return T [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    @SuppressWarnings("unchecked")
    public T get(int i){
        if (i<0 || i>size-1){
            throw new IndexOutOfBoundsException("线性表索引越界");
        }
        return (T)elementData[i];
    }
    
    /**
     * <查找顺序线性表中指定元素的索引>
     * @param element
     * @return [参数说明]
     * 
     * @return int [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public int locate(T element){
        for (int i=0; i<size; i++){
            if (elementData[i].equals(element)){
                return i;
            }
        }
        return -1;
    }
    
    /**
     * <扩容>
     * @param minCapacity [参数说明]
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public void ensureCapacity(int minCapacity){
        //如果数组的原有长度小于目前所需的长度
        if (minCapacity > capacity){
            while (capacity < minCapacity){
                //不断地将capacity*2,直到capacity大于minCapacity
                capacity <<= 1;     
            }
            elementData = Arrays.copyOf(elementData, capacity);
        }
    }
    
    /**
     * <向顺序线性表的指定位置插入一个元素>
     * @param element
     * @param index [参数说明]
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public void insert(T element, int index){
        if (index<0 || index>size){
            throw new IndexOutOfBoundsException("线性表索引越界");
        }
        ensureCapacity(size+1);
        //将指定索引处index之后的所有元素向后移动一格
        System.arraycopy(elementData, index, elementData, 
                index+1, size-index);
        elementData[index] = element;
        size++;
    }
    
    /**
     * <在线性顺序表的开始处添加一个元素>
     * @param element [参数说明]
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public void add(T element){
        insert(element, size);
    }
    
    /**
     * <删除指定索引处的元素,并返回被删除的元素>
     * @param index
     * @return [参数说明]
     * 
     * @return T [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    @SuppressWarnings("unchecked")
    public T delete(int index){
        if (index<0 || index>size){
            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;
    }
    
    /**
     * <删除最后一个元素,并返回被删除的元素>
     * @return [参数说明]
     * 
     * @return T [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public T remove(){
        return delete(size-1);
    }
    
    /**
     * <判断线性顺序表是否为空>
     * @return [参数说明]
     * 
     * @return boolean [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public boolean isEmpty(){
        return size==0;
    }
    
    /**
     * <清空线性表>
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public void clear(){
        Arrays.fill(elementData, null);
    }
    
    /**
     * 输出顺序线性表中的元素
     * @return
     */
    public String toString(){
        if (size == 0){
            return "[]";
        }
        
        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();
    }
}

 

测试

 

public class Test{
    
    /** <一句话功能简述>
     * <功能详细描述>
     * @param args [参数说明]
     * 
     * @return void [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     * @author 
     * @date 2011-9-19
     */
    public static void main(String[] args){
        SequenceList<String> list = new SequenceList<String>();
        list.add("aaaa");
        list.add("bbbb");
        list.add("cccc");
        System.out.println(list);
        //在索引为1处插入一个新的元素
        list.insert("dddd",1);
        System.out.println(list);
        //删除索引为2处得元素
        list.delete(2);
        System.out.println(list);
        //获取cccc字符串在顺序线性表中的位置
        int index = list.locate("cccc");
        System.out.println(index);
    }
    
}

 

 

 

分享到:
评论

相关推荐

    1.基于顺序存储结构的图书信息表的创建和输出 2..基于顺序存储结构的图书信息表的排序 3.基于顺序存储结构的图书信息表的修改

    1.基于顺序存储结构的图书信息表的创建和输出 问题描述定义一个包含图书信息 (书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建。然后,统计图书表中的图书个数,同时逐行输出每本图书的信息。...

    顺序存储结构线性表的插入与删除

    ### 顺序存储结构线性表的插入与删除 #### 知识点概述 在计算机科学领域,线性表是数据结构中最基本的数据组织形式之一,它由一系列具有相同特性的数据元素组成,这些元素之间存在着一种一对一的关系。线性表可以...

    C语言期末大作业:用顺序存储结构实现图书管理系统

    在本项目中,"C语言期末大作业:用顺序存储结构实现图书管理系统"是一个实践性的编程任务,旨在让学生掌握C语言编程基础以及数据结构中的顺序存储结构应用。这个系统允许用户进行一系列图书管理操作,包括图书信息的...

    数据结构实验报告1线性表的顺序存储结构.doc

    实验报告的主题是“数据结构实验报告1:线性表的顺序存储结构”,旨在通过实践让学生掌握线性表在顺序存储结构中的基本操作,包括创建、插入和删除等。实验使用了Visual C++作为开发环境,并涉及到了C++编程语言。 ...

    线性表的顺序存储结构

    在本实验中,线性表采用顺序存储结构进行实现,这是线性表的一种常见存储方式。 顺序存储结构是指在计算机内存中,线性表的各个元素按照它们在逻辑上的顺序依次存储在一块连续的内存区域中。这种存储方式使得线性表...

    队列的顺序存储结构及实现

    ### 队列的顺序存储结构及其实现详解 队列是一种常见的数据结构,它遵循先进先出(First In First Out, FIFO)的原则。在计算机科学中,队列被广泛应用于任务调度、缓存管理、多线程同步等多个场景。队列的存储方式...

    二叉树的顺序存储结构

    顺序存储结构是二叉树的一种非传统存储方式,与链式存储(节点间通过指针链接)不同,顺序存储通常在数组中实现,这种方法对于特定类型的操作可能更有效率。 在二叉树的顺序存储中,我们通常采用一种称为“二叉堆”...

    顺序存储结构线性表c程序源码

    顺序存储结构是一种常见的数据结构,尤其在处理线性数据时非常实用。线性表是数据结构中最基本的一种,它由n(n&gt;=0)个相同类型元素构成的有限序列。在这个特定的压缩包中,"顺序存储结构线性表c程序源码"提供了...

    数据结构实验一线性表的顺序存储结构.doc

    在顺序存储结构中,线性表的元素在内存中是连续存放的,这种存储方式使得我们可以直接通过下标访问元素。在这个实验中,我们将重点探讨线性表在顺序存储结构上的实现,包括其建立、插入、删除、查找和显示等基本操作...

    顺序存储结构(c语言代码)

    在计算机科学中,数据结构是组织和管理大量数据的有效方式,而顺序存储结构是一种基本且简单易懂的数据结构。在C语言中,顺序存储结构通常指的是数组,它将元素按照线性的顺序依次存储在内存中。本文将深入探讨C语言...

    用定长顺序存储结构表示串,求两个串的全部最长公共子串

    在本题目中,任务是使用定长顺序存储结构表示串,并找出两个字符串的最长公共子串。这是一个典型的字符串处理问题,通常在计算机科学和编程领域出现。以下是对这个任务的详细解析: 首先,我们需要理解“定长顺序...

    数据结构中关栈的顺序存储结构

    在这个实验中,我们将深入探讨栈的顺序存储结构,并通过C++语言来实现它。 栈的顺序存储结构,也称为线性存储,是最基础的栈实现方式之一。它使用一个连续的内存区域来存储栈中的元素,如同数组一样。在顺序栈中,...

    数据结构线性表的顺序存储结构

    实验 二 基于链式存储结构 实现线性表的基本的 常见的运算 提示: ⑴ 提供一个实现功能的演示系统 ⑵ 具体物理结构和数据元素类型自行选定 ⑶ 线性表数据可以使用磁盘文件永久保存

    线性表的基本操作之顺序存储结构实现

    在本主题中,我们将深入探讨线性表的顺序存储结构及其基本操作,这些操作包括初始化、建立线性表、插入元素、删除元素、清空线性表以及查找元素。我们将使用C语言来实现这些操作,这对于初学者来说是一个很好的实践...

    员工按照顺序存储结构建立一个线性表

    某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和...把所有员工按照顺序存储结构建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且打印最新的员工名单。

    队列的顺序存储结构及实现操作

    队列的顺序存储结构及实现操作,可以AC的~

    线性表在顺序存储结构上的插入删除运算

    线性表在顺序存储结构上的插入删除运算; 编写主函数(使用字符菜单形式)

    1 表-顺序存储结构.ppt

    1 表-顺序存储结构.ppt 数据结构文档

    线性表的顺序存储结构、链式存储结构上的基本操作

    在本主题中,我们将深入探讨线性表的两种主要存储结构:顺序存储结构和链式存储结构,以及在这两种结构上实现的基本操作。同时,我们还会涉及栈这种特殊类型的线性表及其顺序和链式存储结构。 一、线性表的顺序存储...

    线性顺序存储结构构建的对员工基本操作

    某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和...把所有员工按照顺序存储结构建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且打印最新的员工名单。

Global site tag (gtag.js) - Google Analytics