表,栈和队列(一)(JAVA语言描述)

抽象数据类型 ADT(abstract data type)

抽象数据类型是带有一组操作的一些对象的集合。在ADT的定义中没有地方提到关于这组操作是如何实现的任何解释,像表,集合,图与他们的一些操作的对象可以被看做是抽象数据类型

表ADT

表ADT有许多操作实现,如insert和remove等。

顺序表简单数组实现

顺序表由简单数组实现,创建的时候需要估计表的大小,因为数组创建的时候需要指定大小。
数组的好处是find操作只要常数时间,但是删除和插入操作一般需要线性时间。比如在位置0处插入数据,就必须后面的元素向后移一位腾出空间来用于插入,而如果要在最后一位插入,就直接可以插入。不过平均来看,每次插入或者删除都需要移动一半的数据,所以时间为O(N)。

链表实现

链表由一系列节点组成,这些节点不需要在内存中相连,只要在节点中指定下一个节点的位置就行了。相比于顺序表,链表的情况正好相反。执行find操作时,链表需要从头遍历一遍,所以需要线性时间查找,但是执行insert和remove操作时却很方便。如果要在某个位置i插入时,只需要把它自己的next指向i+1位置,然后原先i位置的next指向自己就实现了插入。删除也是同样的道理,把前一个的next指向自己的后一个位置,那么自己就被删除了。

JAVA Collections API 中的表

JAVA语言包中含有一些普通数据结构的实现,通常叫做Collections API。其中含有Collection接口,Iterator接口还有List接口

Collection接口

Collection(集合)接口存储一组类型相同的对象,下面是该接口的一些最重要的部分

public interface Collection<anyType> extends Iterable<anyType>{
    //返回大小
    int size();
    //判断是否为空
    boolean isEmpty();
    //清空
    void clear();
    //判断是否含有某元素
    boolean contains(anyType x);
    //删除某元素
    boolean remove(anyType x);
    //添加某元素
    boolean add(anyType x);
    //遍历
    java.util.Iterator<anyType> iterator();
}

如下遍历

public static <anyType> void print(Collection<anyType> coll){
    for(anyType item : coll){
        System.out.println(item);
    }
}

Iterator接口

实现Iterable接口的集合必须实现Iterator方法,该方法返回一个Iterator类型的对象,该Iterator是一个在java.util包中定义的接口
Iterator接口的思路是,通过Iterator方法,每个集合均可创建并返回给客户一个实现Iterator接口的对象,并将当前位置的概念在对象内部存储下来,如下

public interface Iterator<anyType> {
    //判断是否有下一项
    boolean hasNext();
    //给出集合的下一项
    anyType next();
    //删除next返回的最新的项
    void   remove();
}

下面为遍历代码

public static <anyType> void print(Collection<anyType> coll){
    Iterator<AnyType> itr = coll.iteartor();
    for(itr.hasNext()){
        anyType item = itr.next();
        System.out.println(item);
    }
}

使用迭代器时,使用其他的add,remove等方法是不合法的,而使用迭代器的remove是合法的。

List接口,ArrayList接口,LinkedLIst接口

java.util的list接口继承了Collection接口,因此它包含Collection接口的所有方法,外加一些其他的方法,下面为一些重要的方法

public interface LIst<AnyType> extends Collection<AnyType>{
    //访问指定idx的值
    AnyType get(int idx);
    //更改指定idx的值
    AnyType set(int idx, AnyType newVal);
    //在指定idx后增加值
    void add(int idx, AnyType x);
      //删除指定idx的值
    void remove(int idx);

    //迭代器
    ListIterator<AnyType> listIterator(int pos);
}

List ADT有两种实现形式
ArrayList类提供了一种可增长数组的实现,优点在于get()和set()操作只需要常数时间,缺点是删除插入操作代价昂贵。
而LinkedList是一种双链表的实现,删除插入的代价非常小,但是不容易做索引,get和set调用代价昂贵,除非调用接近表的端点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值