集合的抽象数据类型采用Java中的接口来描述。定义如下:

piblic interface Set{    boolean add(Object obj);        //向集合中插入一个元素obj    boolean remove(Object obj);     //从集合中删除一个元素obj    boolean contains(Object obj);    //判断一个元素obj是否属于集合    Object value(int i);            //返回集合中第i个元素的值    Object find(Object obj);        //从集合中按值obj查找元素并返回    int size();                     //求出集合中元素的个数    boolean isEmpty();              //判断集合是否为空    void output();                    //输出集合中所有元素    Set union(Set set);               //求当前集合与参数集合set的并集并返回    Set intersection(Set set);        //求当前集合与参数集合set的交集并返回    void clear();                    //清除集合中所有元素,并使之变为空集}

一般来说,数据结构都分为两种存储方式:顺序存储和链接存储。后面的文章中我们介绍其他数据结构的时候也会分为这两种情况。

1.集合的顺序存储结构和操作实现如下:

public class SequenceSet implements Set{    final int minSize=10;   //数组初始长度    private Object[] setArray;   //数组声明    private int len;            //保存集合当前的长度        public SequenceSet()        //无参构造方法定义    {        len=0;        setArray=new Object[minSize];    }        public SequenceSet(int n)        //带数组长度参数构造方法定义    {        if(n
<0||i>len)        {            System.out.println("输入参数i数值有误,应在1和"+len+"之间!");            System.exit(1);        }        return setArray[i-1];    }        public Object find(Object obj)    {        for(int i=0;i

主类程序调试如下:

public class Example{    public static void main(String[] args)    {        Set set1=new SequenceSet(10);        int[] a={20,16,38,42,29};        for(int i=0;i

程序运行结果:

20

16

38

42

29

35

16

29

20

29

38

42

set1的集合长度:4

set1 contains 29

2.集合的链接存储结构和操作实现如下:

结点类:

public class Node{    Object element;    Node next;    public Node(Node nt) {next=nt;}    public Node(Object obj,Node nt)    {        element=obj;next=nt;    }}

实现:

public class LinkSet implements Set{    private Node head;    private int len;        public LinkSet()    {        len=0;        head=new Node(null);    }        public boolean add(Object obj)    {        Node p=head;        while(p.next!=null){            if(p.next.element.equals(obj))  return false;            else p=p.next;        }        p.next=new Node(obj,null);        len++;        return true;    }        public boolean remove(Object obj)    {        Node p=head;        while(p.next!=null)            if(p.next.element.equals(obj)) break;            else p=p.next;        if(p.next!=null){            p.next=p.next.next;            len--;            return true;        }        else return false;    }        public boolean contains(Object obj)    {        Node p=head.next;        while(p!=null){            if(p.element.equals(obj)) return true;            else p=p.next;        }        return false;    }        public Object value(int i)    {        if(i<=0||i>len){            System.out.println("参数i值有误,应该在1和"+len+"之间!");            System.exit(1);        }        int c=1;        Node p=head.next;        while(p!=null)            if(c==i) break; else {c++;p=p.next;}        return p.element;    }        public Object find(Object obj)    {        Node p=head.next;        while(p!=null)        {                if(p.element.equals(obj)) return p.element;            else p=p.next;        }        return null;    }        public int size() {return len;}    public boolean idEmpty() {return len==0;}    public void output()    {        Node p=head.next;        while(p!=null){            System.out.println(p.element.toString());            p=p.next;        }        System.out.println();    }        public Set union(Set set)    {        LinkSet setTemp=new LinkSet();        Node p=head.next;        Node q=setTemp.head;        while(p!=null){            Node r=new Node(p.element,null);            p=p.next;            q.next=r;            q=r;        }        setTemp.len=len;        LinkSet dset=(LinkSet)set;        p=dset.head.next;        while(p!=null){            Object x=p.element;            boolean b=contains(x);            if(!b){                q.next=new Node(x,null);                q=q.next;                setTemp.len++;            }            p=p.next;        }        return setTemp;    }        public Set intersection(Set set)    {        LinkSet setTemp=new LinkSet();        LinkSet dset=(LinkSet)set;        Node p=dset.head.next;        Node q=setTemp.head;        while(p!=null){            Object x=p.element;            boolean b=contains(x);            if(b){                q.next=new Node(x,null);                q=q.next;                setTemp.len++;            }            p=p.next;        }        return setTemp;    }        public void clear()    {        len=0;        head.next=null;    }

主类程序调试如下:

public class Example{    public static void main(String[] args)    {        Set set1=new LinkSet(10);        int[] a={20,16,38,42,29};        for(int i=0;i

结果与顺序存储结构中的调试类运行结果相同。

(完)