數據結構和算法分析之線性表

1.結構目錄


如圖:

數據結構和算法分析之線性表


自定義數組越界異常:

/** 
* @ClassName: OutOfBoundaryException 
* @Description: TODO  自定義的數組越界的異常
* @author 薩摩耶
* @date 2018年4月29日 下午3:37:11 
*  
*/
@SuppressWarnings("serial")
public class OutOfBoundaryException extends Exception{
    public OutOfBoundaryException(String message)
    {
        super(message);
    }

}

List接口:


/** 
* @ClassName: List 
* @Description: TODO 線性表的接口
* @author 薩摩耶
* @date 2018年4月29日 下午3:31:41 
*  
*/
public interface List {
    //返回線性表的大小,即數據元素的個數
    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;

}

strategy配置:(利用Object類型,就會產生一個問題:int類型和String類型的比較)

public interface Strategy {
    //判斷兩個數據元素是否相等
    public boolean equal(Object obj1,Object obj2);
    //比較兩個數據元素的大小
    public int compare(Object obj1,Object obj2);

}

List接口的實現(ListArray.java):

public class ListArray implements List{

    private final int LEN=8;// 數組的默認大小
    private Strategy strategy;//數據元素的比較策略
    private int size;//線性表中數據元素的個數
    private Object[] elements;//數據元素數組
    public ListArray(Strategy strategy)
    {
        this.strategy=strategy;
        this.size=0;
        elements=new Object[LEN];
    }
    @Override
    public int getSize() {
        // TODO Auto-generated method stub
        return 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(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)
            expandSapce();
        for(int j=size;j>i;j--)
            elements[j]=elements[j-1];
            elements[i]=e;
            size++;
            return;

    }
    public void expandSapce()
    {
        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;
        try {
            insert(i,e);
        } catch (OutOfBoundaryException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        return true;
    }

    @Override
    public boolean insertAfter(Object obj, Object e) {
        // TODO Auto-generated method stub
        int i=indexOf(obj);
        if(i<0) return false;
        try {
            insert(i+1,e);
        } catch (OutOfBoundaryException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        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;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;
        try {
            remove(i);
        } catch (OutOfBoundaryException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        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];
    }

}

策略的實現:

/** 
* @ClassName: IntergerStretegy 
* @Description: TODO  整數的比較策略
* @author 薩摩耶
* @date 2018年4月30日 上午9:24:42 
*  
*/
public class IntergerStretegy implements Strategy{

    @Override
    public boolean equal(Object obj1, Object obj2) {
        // TODO Auto-generated method stub
        if(obj1 instanceof Integer&&obj2 instanceof Integer)
        {
            if(obj1==obj2)
                return true;
        }
        return false;
    }

    @Override
    public int compare(Object obj1, Object obj2) {
        // TODO Auto-generated method stub
        return 0;
    }

}

測試類:


public class Test {
    public static void main(String[] args) throws OutOfBoundaryException
    {
        ListArray la=new ListArray(new IntergerStretegy());
        for(int i=0;i<7;i++)
        la.insert(i, i+1);
        System.out.println(la.get(6));
        System.out.println(la.indexOf(5));
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章