数据结构顺序表Java实现

Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查。
//List接口
public interface IList {
    //返回线性表的大小,即数据元素的个数。
    public int getSize();
    //如果线性表为空返回 true,否则返回 false。
    public boolean isEmpty();
    //判断线性表是否包含数据元素 e
    public boolean contains(Object e);
    //返回数据元素 e 在线性表中的序号
    public int indexOf(Object e);
    //将数据元素 e 插入到线性表中 i 号位置
    public void insert(int i, Object e) throws OutOfBoundaryException;
    //将数据元素 e 插入到元素 obj 之前
    public boolean insertBefore(Object obj, Object e);
    //将数据元素 e 插入到元素 obj 之后
    public boolean insertAfter(Object obj, Object e);
    //删除线性表中序号为 i 的元素,并返回之
    public Object remove(int i) throws OutOfBoundaryException;
    //删除线性表中第一个与 e 相同的元素
    public boolean remove(Object e);
    //替换线性表中序号为 i 的数据元素为 e,返回原数据元素
    public Object replace(int i, Object e) throws OutOfBoundaryException;
    //返回线性表中序号为 i 的数据元素
    public Object get(int i) throws OutOfBoundaryException;
}

2.我们在这里还需要比较元素的大小,我们就写一个比较元素大小的策略的接口。

//对象比较策略接口
public interface IStrategy {
    //判断两个数据元素是否相等
    public boolean equal(Object obj1, Object obj2);
    /**
     * 比较两个数据元素的大小 * 如果 obj1 < obj2 返回-1
     * 如果obj1 = obj2 返回0
     * 如果obj1 > obj2 返回1
     */
    public int compare(Object obj1, Object obj2);
}

3.写我们这里需要的策略的实现。

/**
 * 默认比较策略类
 */
public class DefaultStrategy implements IStrategy {

    @Override
    public boolean equal(Object obj1, Object obj2) {
        return obj1.equals(obj2);
    }

    @Override
    public int compare(Object obj1, Object obj2) {
        return obj1.toString().compareTo(obj2.toString());
    }

}

4.我们策略已经写完,下一步我们就写我们顺序表的实现。

//顺序表类
public class MyArrayList implements IList{

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }
    private final int LEN = 8;     //数组的默认大小
    private IStrategy strategy; //数据元素比较策略
    private int size;             //线性表中数据元素的个数
    private Object[] elements;     //数据元素数组
    //构造方法
    public MyArrayList(){
        this(new DefaultStrategy());
    }

    public MyArrayList(IStrategy strategy){
        this.strategy = strategy;
        size = 0;
        elements = new Object[LEN];
    }
    @Override
    public int getSize() {
        // TODO Auto-generated method stub
        return this.size;
    }

    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return size == 0;
    }

    @Override
    public boolean contains(Object e) {
        // TODO Auto-generated method stub
        for(int i = 0; i < size; i++){
            if(this.strategy.equal(e, elements[i])){
                return true;
            }
        }
        return false;
    }

    @Override
    public int indexOf(Object e) {
        // TODO Auto-generated method stub
        for( int i = 0; i < size; i++){
            if(strategy.equal(e, elements[i])){
                return i;
            }
        }
        return -1;
    }

    @Override
    public void insert(int i, Object e) throws OutOfBoundaryException {
        // TODO Auto-generated method stub
        //检查下标越界
        if( i < 0 || i >= size){
            throw new OutOfBoundaryException("指定的插入序号越界。");
        }
        //检查线性表数组的容量
        if (size >= elements.length){
            expandSpace();
        }
        //将插入位置后的数据元素依次向后移动一个单位
        for( int j = size; j > i; j--){
            elements[j] = elements[j-1];
        }
        //插入数据
        elements[i] = e;
        size++; //元素个数加1
    }
    //扩展顺序表空间
    private void expandSpace(){
        Object[] a = new Object[elements.length*2];
        for (int i=0; i<elements.length; i++) {
            a[i] = elements[i];
        }
        elements = a;
    }
    @Override
    public boolean insertBefore(Object obj, Object e) {
        // TODO Auto-generated method stub
        //找到插入位置
        int i = indexOf(obj);
        if (i<0) {
            return false;
        }
        insert(i,e);
        return true;
    }

    @Override
    public boolean insertAfter(Object obj, Object e) {
        // TODO Auto-generated method stub
        int i = indexOf(obj);
        if (i<0) {
            return false;
        }
        insert(i+1,e);
        return true;
    }

    @Override
    public Object remove(int i) throws OutOfBoundaryException {
        // TODO Auto-generated method stub
        //首先检查越界
        if (i<0||i>=size) {
            throw new OutOfBoundaryException("错误,指定的删除序号越界。");
        }
        Object obj = elements[i];
        //被删除的数据元素后的数据前移一个单位
        for (int j=i; j<size-1; j++) {
            elements[j] = elements[j+1];
        }
        //
        elements[--size] = null;
        return obj;
    }

    @Override
    public boolean remove(Object e) {
        // TODO Auto-generated method stub
        //找到被删除数据元素的位置
        int i = indexOf(e);
        if (i<0) {
            return false;
        }
        remove(i);
        return true;
    }

    @Override
    public Object replace(int i, Object e) throws OutOfBoundaryException {
        // TODO Auto-generated method stub
        if (i<0||i>=size){
            throw new OutOfBoundaryException("错误,指定的序号越界。");
        }
        Object obj = elements[i];
        elements[i] = e;
        return obj;
    }

    @Override
    public Object get(int i) throws OutOfBoundaryException {
        // TODO Auto-generated method stub
        if (i<0||i>=size){
            throw new OutOfBoundaryException("错误,指定的序号越界。");
        }
        return elements[i];
    }

}

5.上面的代码中我们的函数都抛出了一个异常,这个异常是我们自己定义的。

public class OutOfBoundaryException extends RuntimeException{

    public OutOfBoundaryException(String err){
        super(err);
    }
}
时间: 2024-12-28 13:16:42

数据结构顺序表Java实现的相关文章

hrbust-1545-基础数据结构——顺序表(2)

http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 412(165 users) Total Accepted: 188(150 users) Rating:  Special Judge: No Description 在长度为n(n<10

数据结构----顺序表与单链表(JAVA)

下面为学习顺序表和单链表的一些基本操作函数: 1 public class SeqList<T> extends Object { 2 protected int n; 3 protected Object[] element; 4 5 public SeqList(int length) { 6 this.element = new Object[length]; 7 this.n = 0; 8 } 9 10 public SeqList() { 11 this(64); 12 } 13 1

数据结构顺序表思想以及完整代码实现

本文转载自趣学算法,方便个人学习参考使用 http://blog.csdn.net/rainchxy/article/details/77946835 数据结构 第3讲 顺序表 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素. 顺序表可以分配一段连续的存储空间Maxsize,用elem记录基地址,用length记录实际的元素个数,即顺序表的长度, 结构体的定义: 结构体定义后,如果要定义个顺序

数据结构----顺序表的增和遍历(2018/10/23)

数据结构包含顺序表和链表 顺序表方便改和查 链表便于增删 顺序表的增和遍历: 代码一: 1 using System; 2 namespace deaiWith 3 { 4 class MySeqList<T> 5 { 6 //实际的元素个数 7 private int _flag; 8 //存储的空间 9 private T[] _ints; 10 public void AddItem(T Item) //增加元素到末尾 ,追加 11 { 12 if (_flag >= _ints.

8.基本数据结构-顺序表和链表

一.内存 - 计算机的作用:对数据进行存储和运算.首先我们需要知道我们目前使用的计算机都是二进制的计算机,就以为着计算机只可以存储和运算二进制的数据.例如下载好的一部电影,该电影可以存储到计算机中,计算机中存储的是基于二进制的电影数据,然后我们可以通过相关的视频播放软件结合相关的硬件对电影的二进制数据进行相关的运算操作,所产生的结果就是我们可以看到电影的画面和听到音频的声音. - 问题:阐述计算机如何计算1+2的结果? - 阐述:简单理解为,首先可以将1和2输入到计算机中,然后计算机会将1和2转

数据结构——顺序表的实现

/* 线性结构的基本特征: 1. 集合中必存在唯一的一个"第一元素" 2. 集合中必存在唯一的一个"最后元素" 3. 除最后元素之外,均有唯一的后继 4. 除第一元素之外,均有唯一的前驱 对线性表的基本操作: {结构初始化} InitList(&L); //构造一个空的线性表L {结构的销毁} DestroyList(&L); //销毁线性表L {引用型操作} ListEmpty(L); //线性表判空 ListLength(L); //返回线性表长

顺序表JAVA代码

publicclassSeqList{       final int defaultSize =10;     //默认的顺序表的最大长度     int maxSize;                      //最大长度       int size;                         //当前长度     Object[] listArray;               //对象数组         publicSeqList(){         init(defa

数据结构顺序表的操作全集(创建,遍历,插入,删除,排序等等)

#include"stdio.h" #include"stdlib.h" #include"malloc.h" #define list_size 100 typedef struct Node { int data[list_size]; int len; }NODE,* PNODE; void creat_list(PNODE L) { int i; int val; int len; /* PNODE L=(PNODE)malloc(siz

数据结构-------顺序表的实现

2016.1-14 顺序表的实现 .h文件 #pragma once #include<stdio.h> #include<string.h> #include<assert.h> #define MAX_SIZE 1000//预定义顺序表为1000 typedef int DataType;//控制以后数据类型 typedef struct SeqList//定义一个结构体 { DataType array[MAX_SIZE];//定义一个数组 size_t size