陣列和鍊錶的比較以及佇列的兩種方式實現

2021-08-31 02:13:39 字數 3054 閱讀 3149

1、定義  

陣列又叫做順序表

,順序表是在記憶體中開闢一段連續的空間來儲存資料,陣列

可以處理一組資料型別相同的資料,但不允許動態定義陣列的大小,即在使用陣列之前必須確定陣列的大小。而在實際應用中,使用者使用陣列之前有時無法準確確定陣列的大小,只能將陣列定義成足夠大小,這樣陣列中有些空間可能不被使用,從而造成記憶體空間的浪費。

鍊錶是一種常見的資料組織形式,它採用動態分配記憶體的形式實現。

鍊錶是靠指標來連線多塊不連續的的空間,在邏輯上形成一片連續的空間來儲存資料

。需要時可以用new分配記憶體空間,不需要時用delete將已分配的空間釋放,不會造成記憶體空間的浪費。

2、二者區分: 

a 從邏輯結構來看

a-1. 陣列必須事先定義固定的長度(元素個數),不能適應資料動態地增減的情況。當資料增加時,可能超出原先定義的元素個數;當資料減少時,造成記憶體浪費。

a-2. 鍊錶動態地進行儲存分配,可以適應資料動態地增減的情況,且可以方便地插入、刪除資料項。(陣列中插入、刪除資料項時,需要移動其它資料項)

b 從記憶體儲存來看

b-1. (靜態)陣列從棧中分配空間, 對於程式設計師方便快速,但是自由度小

b-2. 鍊錶從堆中分配空間, 自由度大但是申請管理比較麻煩.

陣列在記憶體中開闢連續的一塊區域,如果乙個資料要兩個記憶體單元,一組5個資料10個單元就夠了,無需標記其位址,因為陣列定義時候標頂了第乙個原始的位址,其他四個都知道了。

鍊錶可可以是連續的,也可以是不連續的,但一般都是不連續的,一鏈5個資料,如果每個資料本身用2個記憶體單元,那麼10個單元是不夠的,因為每個資料都要表示出下個資料在**,所以乙個資料本身用2個單元,再用1個單元表示此鏈下乙個資料在什麼位址。

c從訪問順序來看 

陣列中的資料在記憶體中的按順序儲存的,而鍊錶是隨機儲存的!

c-1.要訪問陣列中的元素可以按下標索引來訪問,速度比較快,如果對他進行插入操作的話,就得移動很多元素,所以對陣列進行插入操作效率很低!

c-2.由於

煉表表是隨機儲存的,鍊錶在插入,刪除操作上有很高的效率(相對陣列),如果要訪問鍊錶中的某個元素的話,那就得從鍊錶的頭逐個遍歷,直到找到所需要的元素為止,所以鍊錶的隨機訪問的效率就比陣列要低

3、分別用陣列和鍊錶實現佇列:

3-1陣列實現

public class queue 

public queue(int initlen)

public queue()

/*** 在末尾向佇列中增加乙個字串

* @param s:向佇列中增加的字串

*/public void add(e e)

//將s新增到新陣列中指定位置

src[index]=e; }

/*** 得到佇列中指定位置的字串

* @param index 佇列中指定的位置

* @return 返回指定位置的字串

*/public e get(int index)

else return null; }

/*** 返回當前字串的位置

* @param s當前字串

* @return 當前字串的位置

*/public int getpos(e e)

e temp;

temp=(e)src[index];

src[index]=e;

e=temp;

return true; }

}

3-2鍊錶實現

public class node

public string tostring()

}public class linkqueuedemo else

"插入的node是:"+elem); }

/*** 得到佇列中指定位置的字串

* @param index 佇列中指定的位置

* @return 返回指定位置的字串

*/public node get(int index)else if(temp==null)else

return temp;

}}

/*** 返回當前節點的位置

* @param s當前字串

* @return 當前字串的位置

*/public int getpos(e e)else

if(temp.next==null)

return count;

}}

/*** 得到佇列中字串的長度即大小

* @return 返回的是字串的大小

*/public int size()

return len;

}

/*** 刪除佇列中指定位置的字串

* @param index 要刪除字串的位置

* @return 返回鎖刪除的字串

*/public node delete(int index)else if(temp==null)else

pretem.next=temp.next;

}return temp;

} /**

* 刪除佇列中第乙個node

* @return 返回鎖刪除的node

*/public node delete()else

else

return temp;

}}

/*** 刪除指定的字串

* @param s要刪除的字串

* @return true刪除成功 false刪除失敗

*/public boolean delete(e e)

/*** 替換佇列中指定位置的字串

* @param s新的字串

* @param index要更新字串的位置

* @return

*/public boolean update(e e,int index)else if(temp==null)else

temp.elem=e;

}return true;

} public void printqueue()

}}

陣列和鍊錶實現佇列的比較

定義的介面 其中e為泛型,用來定義具體操作的是什麼型別 可以是乙個類也可以是基本資料型別 用包裝類實現 public inte ce iarray public void add e e 新建陣列的最後乙個記憶體單元用來存放新增加的資料 obb obb.length 1 e ob obb publi...

鍊錶 (翻轉鍊錶)的兩種演算法

coding utf 8 author leadingme mail leadingme qq.com mywebsite leadingme.top 翻轉鍊錶 演算法要求 翻轉乙個單鏈表 不帶頭節點 示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null def revers...

陣列模擬佇列的兩種方式

基本陣列模擬佇列 陣列模擬佇列 arrayqueue類 class arrayqueue1 判斷佇列已滿,當佇列尾指向陣列的頭時代表佇列已滿 public boolean isfull 判斷佇列是否為空,佇列的頭和尾指向統一個地方時,代表隊列為空 public boolean isempty 在佇列...