線性邏輯結構特徵:
集合中存在唯一的第乙個資料元素、最後乙個資料元素,集合中剩餘的每個資料元素均有唯一的直接前驅元素和唯一的直接後繼元素
它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。陣列的空間是從棧分配的。
陣列優點:
簡單易用
訪問元素快(常數時間)
陣列缺點:
大小固定:是靜態的(並且要在使用前指定陣列大小)
基於位置的插入操作實現複雜(為了記憶體的連續性,需要搬移資料)
分配乙個塊:若申請記憶體空間很大,比如100m,但若記憶體空間沒有100m的連續空間時,則會申請失敗,儘管記憶體可用空間超過100m。
若是不想要大規模的搬移資料:
若是陣列是無序的,在位置k插入乙個元素,可以直接把k位置的資料搬到陣列的最後面,把新元素放在k位置上。
若是刪除,在某些情況下可以不要求陣列是連續的,那麼可以把元素標記為已刪除,當陣列空間不夠用的時候,再真正去刪除
arraylist
arraylist相當與乙個動態陣列,支援擴容。它可以把很多陣列操作封裝起來,比如陣列的插入和刪除。
陣列在定義的時候,需要給它分配連續的記憶體空間,需要預先指定其大小,當存放的資料大於其大小的時候,我們需要重新分配一塊更大的空間,把原來的複製過去在插入新的元素。
arraylist中,當空間不夠用的時候,它會自動擴容為原來的1.5倍的大小。
但是擴容設計到記憶體的申請和資料的搬移,這是比較耗時的,所以最好預先給定大小
缺點:arraylist無法儲存基本型別,int long等需要封裝成integer,long類,而自動裝箱和拆箱的操作也會有一定的效能消耗,所以如果關注效能或者想用基本型別就選用陣列
多維陣列表示更加直觀
鍊錶中相鄰元素之間通過指標鏈結,最後乙個元素的後繼指標的值為null, 鍊錶的空間是從堆中分配的。
優點:
鍊錶可以在常數時間拓展
在程式執行過程中,鍊錶的大小可以增大或者縮小
鍊錶的空間可按需分配,沒有記憶體空間的浪費
缺點
訪問單個元素的時間開銷問題(需要遍歷)
鍊錶中的指標需要額外的記憶體開銷
對鍊錶進行頻繁的插入和刪除操作,會導致頻繁的記憶體申請和釋放,容易造成記憶體碎片
初始化鍊錶:
用帶頭結點的鍊錶來儲存線性表,必須分配乙個結點空間作為頭結點 o(1)
佇列是限定只能在表的一段進行插入、刪除操作的線性表—後進先出
鏈式棧與順序棧
鏈式棧:
僅僅定義棧頂指標就可以查詢到整個棧。
鏈式棧可以top指標指向實實在在的棧頂元素,也可以是棧頂的後繼元素才是棧頂元素,top指標指向棧頂空元素處
順序棧
在順序棧中,需要定義棧的棧底指標(儲存空間首位址base)、棧頂指標top以及順序儲存空間的大小stacksize
順序棧的top指標指向棧頂的空元素處,top-1才指向棧頂元素
佇列是限定只能在表的一段進行插入操作,在另一端進行刪除操作的線性表
執行插入一端—隊尾 刪除—隊首
對於順序佇列來說:
定義兩個指標(top和rear)分別用於指向順序佇列中的隊頭元素和隊尾元素,由於順序佇列底層實現靠的是陣列,因此 top 和 rear 實際上是兩個變數,它的值分別是隊頭元素和隊尾元素所在陣列位置的下標。
入隊:對應的實現操作是將其儲存在指標 rear 指向的陣列位置,然後 rear+1;
出隊: top+1
造成的問題:
順序佇列之前的陣列儲存空間將無法再被使用,造成了空間浪費;
如果順序表申請的空間不足夠大,則直接造成程式中陣列假溢位,產生溢位錯誤;
採用迴圈佇列
迴圈佇列如何進行判空和滿操作:
鍊錶佇列:
入隊:出隊:
隊頭元素不斷後移,重新整理隊頭元素
資料結構 線性結構(線性表 棧與佇列)
線性表的抽象定義集合a和集合b的並集操作線性表的順序儲存的結構 位址計算獲得元素操作 getelem插入操作 listinsert刪除操作 lisedelete優缺點比較。線性表的單鏈表儲存結構 linklistgetelemlistinsertlistdeletecreatelisthead 頭插...
資料結構 線性表 棧和佇列
資料概念 資料是對客觀事物的符號表示 資料元素是資料的基本單位 資料物件是性質相同的資料元素的集合 資料結構是相互間存在一種或多種特定關係的資料元素集合,是元素的有限集 元素上關係的有限集 資料的關係包括邏輯結構和儲存結構 資料型別是乙個值的集合和定義在這個值集上的一組操作的總稱 抽象資料型別adt...
資料結構 線性表 (棧,佇列,串)
定義 n個元素的有限序列 記為 a1,a2,a3,an 特點 存在唯一表頭表尾。除了表頭,每個元素只有乙個直接前驅。除了表尾,每個元素只有乙個直接後驅。儲存結構 1 順序儲存 位址連續的儲存單元,依次儲存表中資料元素。使得邏輯相鄰的元素,物理位置上也相鄰 優點 隨機訪問表中元素。loc元素位置 l元...