数据结构之集合实现

集合的抽象数据类型采用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<minSize) n=minSize;
        len=0;
        setArray=new Object[n];
    }
    
    public boolean add(Object obj)
    {
        for(int i=0;i<len;i++)
            if(setArray[i].equals(obj)) retrun false;
        if(len==setArray.length){
            Object[] p=new Object[len*2];
            for(int i=0;i<len;i++) p[i]=setArray[i];
            setArray=p;
        }
        setArray[len]=obj;
        len++;
        return true;
    }
    
    public boolean remove(Object obj)
    {
        itn i;
        for(i=0;i<len;i++)
            if(setArray[i].equals(obj)) break;
        if(i<len){
            setArray[i]=setArray[len-1];
            len--;
            return true;
        }
        else return false;
    }
    
    public boolean contains(Object obj)
    {
        for(int i=0;i<le;i++)
        {    
            if(setArray[i].equals(obj)) return true;
        }
        return false;
    }
    
    public Object value(int i)
    {
        if(i<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<len;i++)
            if(setArray[i].equals(obj)) return setArray[i];
        return null;
    }
    
    public int size() {return len;}
    public boolean isEmpty(){return len==0;}
    public void output()
    {
        for(int i=0;i<len;i++)
            System.out.println(setArray[i].toString());
        System.out.println();
    }
    
    public Set union(Set set)
    {
        SequenceSet dset=(SequenceSet)set;
        SequceceSet setTemp=new SequenceSet(len+dset.len);
        int i;
        for(i=0;i<len;i++)
            setTemp.setArray[i]=setArray[i];
        setTemp.len=len;
        for(i=0;i<dset.len;i++)
        {
            Object x=dset.setArray[i];
            boolean b=contains(x);
            if(!b) setTemp.setArray[setTemp.len++]=x;
        }
        return setTemp;
    }
    
    public Set intersection(Set set)
    {
        Sequence dset=(SequenceSet)set;
        int c;
        if(len<dset.len) c=len;else c=dset.len;
        SequenceSet setTemp=new SequenceSet(c);
        for(int i=0;i<dest.len;i++)
        {
            Object x=dset.setArray[i];
            boolean b=contains(x);
            if(b) setTemp.setArray[setTemp.len++]=x;
        }
        return setTemp;
    }
    
    public void clear()
    {
        len=0;
    }
    
}

主类程序调试如下:

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<a.length;i++) set1.add(a[i]);
        Set set2=new SequenceSet();
        set2.add(16); set2.add(29); set2.add(35);
        Set set3;
        set3=set1.union(set2);
        set3.output();
        Set set4;
        set=set1.intersection(set2);
        set4.output();
        set1.remove(new Integer(16));
        set1.output();
        System.out.println("set1集合长度:"+set1.size());
        boolean bb=set1.contains(29);
        if(bb) System.out.println("set1 contains "+29);
    }
}

程序运行结果:

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<a.length;i++) set1.add(a[i]);
        Set set2=new LinkSet();
        set2.add(16); set2.add(29); set2.add(35);
        Set set3;
        set3=set1.union(set2);
        set3.output();
        Set set4;
        set=set1.intersection(set2);
        set4.output();
        set1.remove(new Integer(16));
        set1.output();
        System.out.println("set1集合长度:"+set1.size());
        boolean bb=set1.contains(29);
        if(bb) System.out.println("set1 contains "+29);
    }
}

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

(完)

时间: 2024-10-09 23:34:24

数据结构之集合实现的相关文章

java 16 - 5 LinkedList模拟栈数据结构的集合

请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. 1 package cn_LinkedList; 2 3 import java.util.LinkedList; 4 5 6 7 8 public class MyStack { 9 10 //定义一个LinkedList类的成员变量 11 private LinkedList list = null; 12 13 /** 14 * 构造方法 15

采用LinkedList来模拟栈数据结构的集合--先进后出

三.用LinkedList来模拟栈数据结构的集合 /* * 自定义一个数据结构为LinkedList的集合类*/public class MyCollection_LinkedList { public LinkedList linkedList;            public MyCollection_LinkedList() {             //在构造方法里初始化             linkedList= new LinkedList();             }

C语言、数据结构笔记集合

链表中的“p->next” p->next到底是指p的下一个节点还是p的指针域呢?p是一个指针,那么p->next也应该是一个指针,即p->next应该是一个地址,因此p->next其实是p指向的节点的指针域(next域),所以p->next还是属于当前节点的,只不过它是下一个节点的地址罢了.所以如果函数返回“p->next”,那么函数的类型应为指针函数. 如何让VS2013进行C编程的时候使用基本库函数不会得到警告 把VS项目创建中的安全周期检查关闭就可以任意使

Clojure学习03:数据结构(集合)

Clojure提供了几种强大的数据结构(集合) 一.集合种类 1.vector 相当于数组,如: [2  3   5]  ,  ["ad"  "adas"  "adadsads"] 2.list 相当于链表,如: '(2  3   5)  ,  '("ad"  "adas"  "adadsads") 与vector相比,[]变成了() ,又因为 ()符号是用于函数调用,为了区别,需要在

Java基础知识强化之集合框架笔记29:使用LinkedList实现栈数据结构的集合代码(面试题)

1. 请用LinkedList模拟栈数据结构的集合,并测试:  题目的意思是:     你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟,使用LinkedList功能方法封装成自己的方法. 2. 代码解析: (1)定义自己集合类MyStack,模拟栈数据结构( 先进后出 ) 1 package cn.itcast_05; 2 3 import java.util.LinkedList; 4 5 /** 6 * 自定义的栈集合 7 * 8 * @author Mr He 9

JS中数据结构之集合

集合(set)是一种包含不同元素的数据结构.集合中的元素称为成员.集合的两个最重要特性是:首先,集合中的成员是无序的:其次,集合中不允许相同成员存在.当你想要创建一个数据结构用来保存一些独一无二的元素时就可以用到集合. 基于数组的 Set 类的实现 function Set() { this.dataStore = []; this.add = add; this.remove = remove; this.size = size; this.union = union; //求并集 this.

大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配

第十一章 数据结构(下)-集合操作11.1 集合元素的映射-map11.1.1 map 映射函数的操作11.1.2 高阶函数基本使用案例1+案例211.1.3 使用 map 映射函数来解决11.1.4 模拟实现 map 映射函数的机制11.1.5 课堂练习11.2 集合元素的扁平-flatMap11.3 集合元素的过滤-filter11.4 集合元素的化简-reduce11.5 集合元素的折叠-fold11.6 集合元素的扫描-scan11.7 集合的综合应用案例11.8 集合的合并-zip11

JAVA 泛型与常见的数据结构和集合

泛型与常见的数据结构和集合 集合&迭代器 集合体系结构图 由于不同的数据结构(数据的组织,存储方式),所以java为我们提供了不同的集合 不同的集合他们的功能都是相似的,不断向上提取,将共性抽取出来 Collection中的常用功能 boolean add(Object e): 向集合中添加元素 void clear():清空集合中所有元素 boolean contains(Object o):判断集合中是否包含某个元素 boolean isEmpty():判断集合中的元素是否为空 boolea

java中的数据结构(集合|容器)

对java中的数据结构做一个小小的个人总结,虽然还没有到研究透彻jdk源码的地步.首先.java中为何需要集合的出现?什么需求导致.我想对于面向对象来说,对象适用于描述任何事物,所以为了方便对于对象的操作.存储就出现了集合,集合应该是存储对象最常用的一种方式了,相对于数组更灵活,可变长度.同时集合也只能存储对象不能使基本数据类型. 集合框架分为两个派系Collection和Map而每一种集合类型都是基于特定的数据结构,Collection接口继承了Iterable接口所以可以使用Iterable