數組隊列


數組隊列

隊列

數組隊列?這怎么看都像是兩個次放在了一起,組成了一個名詞,沒錯,我們的數組隊列就是用我們的數組去實現了我們的隊列,數組我們之前已經認識過了,那么啥是隊列呢?隊列,顧名思義,就是隊列,(說了相當於沒說),其實就是我們現實生活中常見現象:排隊,排隊形成的一列,我們都排過隊,老實說,我很討厭排隊,特別是排長長的隊,所以我一般在人少的時候去。但是排隊是必不可少的,它保證了我們的公平:先來的先辦完事,后來的后辦事。所以我們從這里也就知道了數組隊列的基本情況:可以不斷地加入數據,沒有限制。第二先進先出,后進后出。

數組隊列

數組隊列,在我們認識過隊列之后,我們就可以更好的理解數組隊列了,也就是用數組來實現隊列,我們知道了隊列的一個優點,不限人數,想排多少就排多少,所以這也就解決的數組中一個缺點,數組的長度是固定的。我們都明白一個東西一旦固定了,那它也就是死的了,在某些方面,這也不能算是一個缺點,但是在程序中,數組的使用也就失去靈活性,特別是當我們不清楚要存的數據的具體數量時,你說設小一點吧,又不夠用,但是設大了吧,有占用我們的內存,所以,這時,我們的數組隊列就出場了;總的來說,數組隊列增加了靈活性;

數組隊列的實現(java)

a.  首先是我們去定義一個接口;定義基本的抽象方法:

①  增加元素的方法;在固定的位置 ,添加元素的方法;

②  刪除該數組中一個元素的方法(根據元素進行刪除);

③  刪除一個位置上面的數據的方法(根據下標進行刪除操作);

④  更新數據(同樣可以分為更新特點位置的元素,和用新的元素來代替舊元素)當然還要加上獲取數組長度,以及獲取數值的值的方法,

⑤  總的來說這些方法都是根據自己的實際需要,去定義以及實行的;

b.  另外我們為了讓我們的數組隊列可以存儲多種類型的數,改變數組只能一種數據的情況;我們給我們的加上了泛型;

 

 

c.  第二點就是實現我們上面定義的接口:新建一個class,實現我們的接口,然后重寫他的方法;我們來看一下其中的一部分:

這樣我們就可以實例化多個類型的數組隊列啦 

另外我們的java中也提供了數組隊列;不想自己定義的話,可以使用java自帶;

 

/**
 * 自定義數組隊列接口;用來解決數組的長度固定缺點;,同時使用<E>表示該接口支持泛型
 *
 */
public interface MyqueueArray<E> {
         
 
     /**
      * 添加元素
      * @param e為要添加的元素
      */
     public void adddata(E e);
     /**
      *在固定的位置 ,添加元素;
      *@param location為要添加的位置
      * @param e為要添加的元素
      * @return 返回true表示插入成功,返回false表示插入失敗
      */
     public boolean adddata(int location,E e);
     /**
      * 移除元素; 
      * @param  location為要移除的元素的位置
      * @return 返回null表示移除成功,否則表示移除失敗;
      */
     public E removedata(int location);
     /**
      * 移除元素; 
      * @param e為要移除的元素
      * @return 返回true表示移除成功,否則表示移除失敗
      */
     public boolean removedata(E e);
     /**
      * 更新指定位置的元素; 
      * @param location表示要更新的元素的下標
      *  @param e表示要新的元素
      * @return 返回true表示移除成功,否則表示移除失敗
      */
     public boolean updata(int location,E e);
     /**
      * 更新指定的元素; 
      * @param old表示要更新的元素
      *  @param e表示要新的元素
      * @return 返回true表示移除成功,否則表示移除失敗
      */
     public boolean updata(E old,E a);
        /**
          * 獲取數組隊列中存儲的元素總數
         * @return 返回數組隊列中存儲的元素總數屬性
         */
     public int getlength();
     /**
        * 獲取指定索引位置的元素
         * @param location要獲取元素的索引位置
         * @return 返回null表示獲取失敗,否則會返回獲取到的元素
         */
     public E getvalue(int location);
     

}
MyqueueArray
package 數組隊列811;

/**
 * 定義數組隊列的實現類,該類實現了 MyqueueArray接口
 * 
 */
public class MyqueueArrayImpl<E> implements MyqueueArray<E> {

    private int size = 0;// 聲明一個記錄存儲元素總數的屬性名;
    Object[] Array;// 聲明一個數組變量;

    public MyqueueArrayImpl(int i) {//重寫構造方法;
        Array = new String[i];
        size = i;
    }

    /**
     * 添加元素
     * @param a為要添加的元素
     */
    public void adddata(E a) {
        Object[] NewArray = new Object[size + 1];// 新建一個數組;數組長度為size+1;
        NewArray[size] = a;// 把a放到最后的位置;
        for (int i = 0; i < size; i++) {
            NewArray[i] = Array[i];// 把數組Array的數放入NewArray中;
        }
        Array = NewArray;// 把新的數組地址賦給Array;
        size++;// size增加;添加一個數就加1;

    }

    /**
     * 在固定的位置 ,添加元素;
     * @param location為要添加的位置
     * @param a為要添加的元素
     * @return 返回true表示插入成功,返回false表示插入失敗
     */
    public boolean adddata(int location, E a) {
        if (location >= size || location<0) {
            return false;
        } else {
            Object[] NewArray = new Object[size + 1];// 新建一個數組;數組長度為size+1;
            NewArray[location] = a;
            for (int i = 0; i < location; i++) {
                NewArray[i] = Array[i];// 把數組Array在后面的數放入NewArray中;
            }
            for (int i = location; i < size; i++) {
                NewArray[location+1] = Array[i];// 把數組Array中在location前面的數放入NewArray中;
            }
            Array = NewArray;// 把新的數組地址賦給Array;
            size++;
            return true;
        }
    }

    /**
     * 根據位置移除元素;
     * @param location為要移除的元素的位置
     * @return 返回null表示移除成功,否則表示移除失敗;
     */
    @SuppressWarnings("unchecked")
    public E removedata(int location) {
        for (int i = 0; i < size; i++) {
            if (i == location) {
                Array[location] = null;
                for (int j = i; j < size - 1; j++) {
                    Array[j] = Array[j + 1];
                }
            }
        }
        size--;
        return (E) Array[location];
    }

    /**
     * 移除元素;
     * 
     * @param a為要移除的元素
     * @return 返回true表示移除成功,否則表示移除失敗
     */
    public boolean removedata(E a) {
        for (int i = 0; i < size; i++) {
            if (Array[i] == a) {
                Array[i] = null;
                for (int j = i; j < size - 1; j++) {
                    Array[j] = Array[j + 1];
                }
                size--;
            }
        }
        return true;
    }

    /**
     * 更新指定位置的元素;
     * 
     * @param location表示要更新的元素的位置
     * @param a表示要新的元素
     * @return 返回true表示移除成功,否則表示移除失敗
     */
    public boolean updata(int location, E a) {
        if (location < size)
            Array[location] = a;
        return true;
    }

    /**
     * 更新指定的元素;
     * 
     * @param old表示要更新的元素
     * @param a表示要新的元素
     * @return 返回true表示移除成功,否則表示移除失敗
     */
    public boolean updata(E old, E a) {
        for (int i = 0; i < size; i++) {
            if (Array[i] == old)
                Array[i] = a;
        }
        return true;
    }

    /**
     * 獲取數組隊列中存儲的元素總數
     * 
     * @return 返回數組隊列中存儲的元素總數屬性
     */
    public int getlength() {

        return size;
    }

    /**
     * 獲取指定索引位置的元素
     * 
     * @param location要獲取元素的索引位置
     * @return 返回0表示獲取失敗,否則會返回獲取到的元素
     */
    @SuppressWarnings("unchecked")
    public E getvalue(int location) {

        if (location < 0 || location >= size)
            return null;
        return (E) Array[location];
    }

}
MyqueueArrayImpl

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM