數據結構:數組、鏈表、棧、隊列的理解


解釋定義

數據結構:

數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。再簡單描述一下:數據結構就是描述對象間邏輯關系的學科。

如果還是不太清楚下面會舉例說明的。

數據存儲結構:

簡單的講就是數據在計算機中的存儲方式。

常用的數據存儲方式有兩種:順序存儲,非順序存儲。順序存儲就是把數據存儲在一塊聯系的存儲介質(硬盤或內存等)中。反之就是非順序存儲咯。Java中的數組就是典型的順序存儲,鏈表就是非順序存儲。數組存儲數據時會開辟出一塊聯系內存,按順序存儲。鏈表先不會開辟出一塊內存來,而是只需要知道下一個節點存儲的位置,就能把所以的數據連起來了。所以單向鏈表的最后一個節點是指向Null的。

數組、鏈表、棧和隊列是最基本的數據結構,任何程序語言都會涉及到其中的一種或多種。

 

數組

數組是數據結構中很基本的結構,很多編程語言都內置數組。

在java中當創建數組時會在內存中划分出一塊連續的內存,然后當有數據進入的時候會將數據按順序的存儲在這塊連續的內存中。當需要讀取數組中的數據時,需要提供數組中的索引,然后數組根據索引將內存中的數據取出來,返回給讀取程序。在Java中並不是所有的數據都能存儲到數組中,只有相同類型的數據才可以一起存儲到數組中。

所有的數據結構都支持幾個基本操作:讀取、插入、刪除。

因為數組在存儲數據時是按順序存儲的,存儲數據的內存也是連續的,所以他的特點就是尋址讀取數據比較容易,插入和刪除比較困難。簡單解釋一下為什么,在讀取數據時,只需要告訴數組要從哪個位置(索引)取數據就可以了,數組會直接把你想要的位置的數據取出來給你。插入和刪除比較困難是因為這些存儲數據的內存是連續的,要插入和刪除就需要變更整個數組中的數據的位置。舉個例子:一個數組中編號0->1->2->3->4這五個內存地址中都存了數組的數據,但現在你需要往4中插入一個數據,那就代表着從4開始,后面的所有內存中的數據都要往后移一個位置。這可是很耗時的。

鏈表

在java中創建鏈表的過程和創建數組的過程不同,不會先划出一塊連續的內存。因為鏈表中的數據並不是連續的,鏈表在存儲數據的內存中有兩塊區域,一塊區域用來存儲數據,一塊區域用來記錄下一個數據保存在哪里(指向下一個數據的指針)。當有數據進入鏈表時候,會根據指針找到下一個存儲數據的位置,然后把數據保存起來,然后再指向下一個存儲數據的位置。這樣鏈表就把一些碎片空間利用起來了,雖然鏈表是線性表,但是並不會按線性的順序存儲數據。

由於鏈表是以這種方式保存數據,所以鏈表在插入和刪除時比較容易,讀取數據時比較麻煩。舉個例子:一個鏈表中0->1->2->3->4這五個內存地址中都存了數據,現在需要往2中插入一條數據,那么只需要更改1號和2號中記錄下一個數據的位置就行了,對其他數據沒有影響。刪除一條數據與插入類似,很高效。但是如果是想要在鏈表其中取出一條數據,就需要從0號開始一個一個的找,直到找到想要的那條數據為止。

鏈表中插入

鏈表中刪除

棧是一種先進后出的數據結構,數組和鏈表都可以生成棧。當數據進入到棧時會按照規則壓入到棧的底部,再次進入的數據會壓在第一次的數據上面,以此類推。

在取出棧中的數據的時候會先取出最上面的數據,所以是先進后出。

由於數組和鏈表都可以組成棧,所以操作特點就需要看棧是由數組還是鏈表生成的了,然后就會繼承相應的操作特點。

隊列

隊列是一種先進先出的數據結構,數組和鏈表也都可以生成隊列。當數據進入到隊列中時也是先進入的在下面后進入的再上面,但是出隊列的時候是先從下面出,然后才是上面的數據出,最晚進入的隊列的,最后出。

舉個簡單的例子:可以把棧和隊列看成是兩根管子,這兩根管子是用來存儲數據的,有可能是數組生成的也有可能是鏈表生成的,棧的這根管子有一頭是封死的,所以像這個管子放數據只能從一個口進,拿出數據的時候也只能從這一個口拿出來。而隊列這根管子呢兩個口都是敞開的,一個口負責進數據,另一個口負責出數據,所以從一進口先進去的數據,在出口處會先被拿出來。

另外棧和隊列其實是可以互相轉換的。后續再把代碼的例子補上,太晚了,先寫到這吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM