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);
}
}

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

  1. 顺序表----java实现

    最简单的数据结构--顺序表,此处以数组为例. 顺序表的优点:支持随机读取,内存空间利用率高. 顺序表的缺点:1.需要预先给出最大数据元素个数,这往往很难实现. 2.插入和删除时需要移动大量数据. Se ...

  2. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

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

    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...

  4. Java数据结构——顺序表

    一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...

  5. c数据结构 顺序表和链表 相关操作

    编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...

  6. 数据结构顺序表删除所有特定元素x

    顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...

  7. 数据结构---顺序表(C++)

    顺序表 是用一段地址连续的存储单元依次存储线性表的数据元素. 通常用一维数组来实现 基本操作: 初始化 销毁 求长 按位查找 按值查找 插入元素 删除位置i的元素 判空操作 遍历操作 示例代码: // ...

  8. 顺序表JAVA代码

        publicclassSeqList{       final int defaultSize =10;     //默认的顺序表的最大长度     int maxSize;          ...

  9. python算法与数据结构-顺序表(37)

    1.顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素.顺序表可以分配一段连续的存储空间 ...

随机推荐

  1. POJ 3211 Washing Cloths(01背包变形)

    Q: 01背包最后返回什么 dp[v], v 是多少? A: 普通01背包需要遍历, 从大到小. 但此题因为物品的总重量必定大于背包容量, 所以直接返回 dp[V] 即可 update 2014年3月 ...

  2. python2.0 s12 day3

    s12 day3 视频每节的内容 03 python s12 day3 本节内容概要 第三天的主要内容 上节没讲完的: 6.集合 7.collections 1)计数器 2)有序字典 3)默认字典 4 ...

  3. RIDE指定log和report的输出目录

    在命令行中,输入 pybot --help就可以看到他支持的所以命令和相关的介绍 我们可以看到outputdir这个命令,就是来知道report和log的输出目录的 如果你是在命令行中,那么直接后面跟 ...

  4. 使用 XPath

    XPath 简介: (1) 前面我们爬取一个网页,都是使用正则表达式来提取想要的信息,但是这种方式比较复杂,一旦有一个地方写错,就匹配不出来了,因此我们可以使用 XPath 来进行提取(2) XPat ...

  5. linux IP 设置

    修改ip地址即时生效:# ifconfig eth0 192.168.1.102 netmask 255.255.255.0启动生效:修改/etc/sysconfig/network-scripts/ ...

  6. 设计模式之装饰模式(Java实现)

    “怎么了,鱼哥?” “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的却是一个X的,不说了,退货去.你先开讲吧,你 ...

  7. JavaIO简单代码实例

    最近又复习了下JavaIO写了些实例代码都很简单但是能体现大部分方法的用法. IO流实现文件的拷贝   几种不同的方法: package com.wxisme.TestIO; import java. ...

  8. 页面链接跳转历史URL不记录的兼容处理

    1.阻止跳转a标签的链接 2.location.replace(href) 不生成新的历史记录, 但有bug 3.首先通过HTML5 history.replaceState()方法把当前URL地址替 ...

  9. js获取元素的外链样式

    一般给元素设置行内样式,如<div id="div1" style="width:500px;"></div>.如要获取它的样式,即可d ...

  10. IIS与ASP.NET中的线程池

    1. W3 Thread Pool(W3TP) 当处于内核模式的http.sys接收到来自用户的请求之后,会将请求放入队列中.那处于用户模式的w3wp进程如何从内核模式的队列中取出请求呢?I/O完成端 ...