數(shù)據(jù)結(jié)構(gòu)與算法二(動態(tài)數(shù)組)

圖片.png

目錄
一洞慎、什么是數(shù)據(jù)結(jié)構(gòu)丹弱?
二庐船、線性表
2.1 數(shù)組(Array)
2.2 動態(tài)數(shù)組(Dynamic Array)接口設(shè)計
2.3 動態(tài)數(shù)組(Dynamic Array)示例

一昆庇、什么是數(shù)據(jù)結(jié)構(gòu)歇万?

概念:數(shù)據(jù)結(jié)構(gòu)是計算存儲揩晴、組織數(shù)據(jù)的方式

在實(shí)際應(yīng)用中,根據(jù)使用場景來選擇最合適的數(shù)據(jù)結(jié)構(gòu)

常見的數(shù)據(jù)結(jié)構(gòu)


二贪磺、線性表線性表

線性表示具有n相同類型元素的有限序列(n>=0)


圖片.png

常見的線性表有

  • 數(shù)組
  • 鏈表
  • 隊(duì)列
  • 哈希表(散列表)

2.1 數(shù)組(Array):

int[] array = new int[]{11,2,33};

2.2 動態(tài)數(shù)組(Dynamic Array)接口設(shè)計

? int size(); // 元素的數(shù)量
? boolean isEmpty(); // 是否為空
? boolean contains(E element); // 是否包含某元素
? void add(E element); // 添加元素到最后面
? E get(int index); // 返回index位置對應(yīng)的元素
? E set(int index, E element); // 設(shè)置index位置的元素
? void add(int index, E element); // 往index位置添加元素
? E remove(int index); // 刪除index位置對應(yīng)的元素
? int indexOf(E element); // 查看元素的位置
? void clear(); // 清除所有元素

2.3 動態(tài)數(shù)組(Dynamic Array)示例

動態(tài)數(shù)組的屬性設(shè)計

圖片.png

數(shù)組的常見操作無非就是 硫兰、寒锚、

ArrayList初始化操作

//泛型 可以存放任何數(shù)據(jù)類型(int/string/double) 
//java中在定義類的時候就要 定義泛型
//<E> 表示泛型  E:表示類型名 (名字隨便自己冉儆场)
//后面用到E都表示是可以變的  E存放元素的類型
//在java中 所有的類都繼承Object
public class ArrayList<E> {

    //成員變量
    private int size; //元素的數(shù)量
  
     public  E[] elements; //所有的元素 
     
     private static final int  DEFAULT_CAPACICY = 2;
     
     private static final int  ELEMENT_NOT_FOUND  = -1;
     
     //初始化
     @SuppressWarnings("unchecked")
    public ArrayList(int capaticy) {
         capaticy = (capaticy < DEFAULT_CAPACICY)?DEFAULT_CAPACICY:capaticy;
         //強(qiáng)制轉(zhuǎn)換
         elements = (E[]) new Object[capaticy];
     }
     public ArrayList() {
         this(DEFAULT_CAPACICY);
    }
    /**
      * 添加元素到尾部
      * */
     public void add(E element ) {

         add(size, element);
    }
     /**
      * 在index位置插入一個元素
      * */
     public void add(int index, E element) {

         rangeCheckForAdd(index);
         ensureCapacity(size+1);
         
         for (int i = size ; i > index; i--) {
            
             elements[i] =  elements[i-1];
        }
         elements[index] = element;
         size ++;
     }
圖片.png
       /**
      * 刪除index位置的元素 
      * */
     public void remove(int index) {
  
         rangeCheck(index);

         for (int i = index + 1; i < size; i++) {
             elements[i- 1] = elements[i];
        }
         elements[--size] = null;
     }
     /**
      * 刪除某個元素 
      * */
      
     public void removeElement(E element) {
         remove(indexOf(element));
    }

     /**
       *  清除所有元素 
       */   
    public void clear() {
        
//      elements =null; 與for的區(qū)別
//      推薦使用for  能循環(huán)利用則循環(huán)利用
//      elements =null指的是直接將棧空間 向堆空間申請的線斷掉 則堆空間所有數(shù)組刹前、內(nèi)存都清除 那意味著下次又要new一個數(shù)組   
//      for則表示的是 讓數(shù)組里面指向的對象為null
        
        //清空內(nèi)存
        for (int i = 0; i < size; i++) {
            elements[i]= null;
        }
//      elements =null;
        size = 0;
        
    }
圖片.png
     /**
      * 獲取index位置的元素
      * */
     public E get(int index) {
         rangeCheck(index);
         return elements[index];
     }
     
     /**
      * 查看元素的索引
      * */
     public int indexOf(E element) {
         if (element == null) {
             
                for (int i = 0; i < size; i++) {
                    if (elements[i] == null) return i;
                }
        }else {
            
            for (int i = 0; i < size; i++) {
                if (element.equals(elements[i])) return i;
            }
        }
         return ELEMENT_NOT_FOUND ;
    }
       /**
         * 元素的數(shù)量
         */
     public int size() {
         return size;
     }

圖片.png
    /**
      * 設(shè)置index位置的元素
      * */
     public void set(int index,E element) {
         rangeCheck(index);
         elements[index] = element; 
     }
圖片.png
其他操作
        /**
      * 是否為空
      */
     public boolean isEmpty() {
         return size == 0;
     }
     /**
      * 是否包含某個元素 
      */
     
     public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

//擴(kuò)容
     //保證容量
    private void ensureCapacity(int capacity) {
        int oldCapacity = elements.length;
        if (oldCapacity >= capacity) return; //不需要擴(kuò)容
        
        //擴(kuò)容 oldCapacity >> 1 等價于 *1.5  但是*1.5比位運(yùn)算耗時間
        //新容量為舊容量的1.5倍 oldCapacity >> 1 意思是 >>(右移) /2 泳赋, 如果是 <<(左移) *2
         int newCapacity =  oldCapacity + (oldCapacity >> 1);
         
         @SuppressWarnings("unchecked")
        E[] newElements = (E[])new Object[newCapacity];
         for (int i = 0; i < size; i++) {
             newElements[i] = elements[i];
        }
         elements = newElements;
         System.out.println(oldCapacity+ "擴(kuò)容為:" + newCapacity);
    }
    private void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
        }
    }
     public void rangeCheck(int index) {
         
         if (index<0 || index >= size) {
                throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
                
            }
    }
     @Override
    public String toString() {
         //size = 3,  [1,2,3]
         StringBuilder string =  new StringBuilder();
         string.append("size = ").append(size).append(", [");
         for (int i = 0; i < size; i++) {
             //方式一:細(xì)節(jié)處理的更加好一點(diǎn) 
             if(i != 0) { 
                 string.append(",");
             }
             string.append(elements[i]); 
             //方式二:需要做減法操作
//           if (i != size - 1) {
//               string.append(",");
//          }
        }
         string.append("]"); 
        return string.toString();
        
    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喇喉,隨后出現(xiàn)的幾起案子祖今,更是在濱河造成了極大的恐慌,老刑警劉巖拣技,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千诬,死亡現(xiàn)場離奇詭異,居然都是意外死亡膏斤,警方通過查閱死者的電腦和手機(jī)大渤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掸绞,“玉大人,你說我怎么就攤上這事耕捞∠蔚В” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵俺抽,是天一觀的道長敞映。 經(jīng)常有香客問我,道長磷斧,這世上最難降的妖魔是什么振愿? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任捷犹,我火速辦了婚禮,結(jié)果婚禮上冕末,老公的妹妹穿的比我還像新娘萍歉。我一直安慰自己,他們只是感情好档桃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布枪孩。 她就那樣靜靜地躺著,像睡著了一般藻肄。 火紅的嫁衣襯著肌膚如雪蔑舞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天嘹屯,我揣著相機(jī)與錄音攻询,去河邊找鬼。 笑死州弟,一個胖子當(dāng)著我的面吹牛钧栖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呆馁,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼桐经,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浙滤?” 一聲冷哼從身側(cè)響起阴挣,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纺腊,沒想到半個月后畔咧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揖膜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年誓沸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壹粟。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拜隧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出趁仙,到底是詐尸還是另有隱情洪添,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布雀费,位于F島的核電站干奢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盏袄。R本人自食惡果不足惜忿峻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一薄啥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逛尚,春花似錦垄惧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至克握,卻和暖如春蕾管,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菩暗。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工掰曾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人停团。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓旷坦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佑稠。 傳聞我的和親對象是個殘疾皇子秒梅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容