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陣列實現
3-2鍊錶實現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; }
}
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 在佇列...