一、陣列
陣列是乙個儲存元素的線性集合,它使用一塊連續的記憶體空間儲存資料,儲存的資料的個數在分配記憶體的時候就是確定的。
訪問陣列中第 n 個元素的時間花費是o(1) ,在陣列中查詢乙個指定的元素則是o(n)。
向陣列中插入或刪除元素時,最好的情況是在陣列的末尾進行操作,時間複雜度是o(1) ,最壞情況是插入或者刪除第乙個元素,時間複雜度是o(n) 。
在陣列的任意位置插入或刪除元素時,後面的元素全部需要移動,移動的元素和元素個數有關,總體的時間複雜度仍然是o(n) 。
二、鍊錶
鍊錶是由一組節點組成的集合。每個節點包括兩個部分:乙個是儲存資料元素的資料域,另乙個是儲存下乙個結點位址的指標域。每個節點都使用乙個物件的引用指向它的後繼,最後乙個節點的指標指向null。
鍊錶不需要提前分配固定大小儲存空間,當需要儲存資料的時候分配一塊記憶體並將這塊記憶體插入鍊錶中。
鍊錶分為單鏈表、雙鏈表、迴圈鍊錶。
在鍊錶中查詢第 n 個資料以及查詢指定的資料的時間複雜度是 o(n) ,插入和刪除資料的時間複雜度是 o(1) 。
陣列和鍊錶的區別:
陣列鍊錶
動態儲存分配
陣列必須事先定義固定的長度(元素個數),不能適應資料動態地增減的情況。當資料增加時,可能超出原先定義的元素個數;當資料減少時,造成記憶體浪費。
鍊錶動態地進行儲存分配,可以適應資料動態地增減的情況,且可以方便地插入、刪除資料項。(陣列中插入、刪除資料項時,需要移動其它資料項)。
邏輯結構角度
陣列是將元素在記憶體中連續存放,由於每個元素占用記憶體相同,可以通過下標迅速訪問陣列中任何元素。但是如果要在陣列中增加乙個元素,需要移動大量元素,在記憶體中空出乙個元素的空間,然後將要增加的元素放在其中。同理,如果想刪除乙個元素,同樣需要移動大量元素去填掉被移動的元素。如果應用需要快速訪問資料,很少或不插入和刪除元素,就應該用陣列。
鍊錶中的元素在記憶體中不是順序儲存的,而是通過存在元素中的指標聯絡到一起。比如:上乙個元素有個指標指到下乙個元素,以此類推,直到最後乙個元素。如果要訪問鍊錶中乙個元素,需要從第乙個元素開始,一直找到需要的元素位置。但是增加和刪除乙個元素對於鍊錶資料結構就非常簡單了,只要修改元素中的指標就可以了。如果應用需要經常插入和刪除元素你就需要用鍊錶資料結構了。
記憶體儲存角度
(靜態)陣列從棧中分配空間, 對於程式設計師方便快速,但自由度小。
鍊錶從堆中分配空間, 自由度大但申請管理比較麻煩。
總結1)陣列靜態分配記憶體,鍊錶動態分配記憶體;
2)陣列在記憶體中連續,鍊錶不連續;
3)陣列元素在棧區,鍊錶元素在堆區;
4)陣列利用下標定位,時間複雜度為o(1),鍊錶定位元素時間複雜度o(n);
5)陣列插入或刪除元素的時間複雜度o(n),鍊錶的時間複雜度o(1)。
三、佇列
佇列是一種先進先出(first-in-first-out,fifo)的資料結構,用於儲存按順序排列的資料。
佇列只能在隊尾插入元素,在隊首刪除元素。
佇列可以使用陣列和鍊錶來實現。
佇列的兩種操作主要是:在隊尾插入新元素和刪除隊首的元素。插入操作也叫做入隊,刪除操作也叫做出隊。
四、棧棧是一種後進先出(last-in-first-out,lifo)的資料結構,棧內的元素只能通過列表的一端訪問,這一端稱為棧頂。
由於棧具有**先出的特點,所以任何不在棧頂的元素都無法訪問。為了得到棧底的元素,必須先拿掉上面的元素。
棧也可以使用陣列和鍊錶來實現。
棧的兩種操作主要是:將乙個元素壓入棧和將乙個元素彈出棧。
資料結構與演算法(鍊錶 棧 佇列)
資料結構與演算法 演算法的5個基本特性 輸入 輸出 有窮性 確定性和可行性 演算法的時間複雜度 t o f n 空間複雜度 s n o f n 儲存空間的實現 線性表 list 零個或多個資料元素的有限序列 順序儲存結構 連續的儲存單元 define maxsize 20 typedef int e...
基礎資料結構與演算法 陣列,佇列,鍊錶,棧
判斷是否需要擴容 private void judgesize else 擴容或者收縮 param size private void resize int size data temp public string pop else public intgetsize public boolean ...
資料結構 棧 佇列 鍊錶
棧 1,棧只能從表的一端訪問資料,另一端是封閉的。2,在棧中,無論是存資料還是取資料,都必須遵循 先進後出 的原則,即最先進棧的元素最後出棧。基於 棧結構的特點,在實際應用中,通常只會對棧執行以下兩種操作 向棧中新增元素,此過程被稱為 進棧 入棧或壓棧 從棧中提取出指定元素,此過程被稱為 出棧 或彈...