面試官:講一講你對數據結構——數組、鏈表、棧、隊列的理解

本文已收錄GitHub,更有互聯網大廠面試真題,面試攻略,高效學習資料等java

1、解釋定義

1. 數據結構git

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

若是仍是不太清楚下面會舉例說明的。面試

2. 數據存儲結構編程

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

經常使用的數據存儲方式有兩種:順序存儲,非順序存儲。順序存儲就是把數據存儲在一塊聯繫的存儲介質(硬盤或內存等)中。反之就是非順序存儲咯。Java中的數組就是典型的順序存儲,鏈表就是非順序存儲。數組存儲數據時會開闢出一塊聯繫內存,按順序存儲。鏈表先不會開闢出一塊內存來,而是隻須要知道下一個節點存儲的位置,就能把因此的數據連起來了。因此單向鏈表的最後一個節點是指向Null的。數據結構

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

2、數組

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

在java中當建立數組時會在內存中劃分出一塊連續的內存,而後當有數據進入的時候會將數據按順序的存儲在這塊連續的內存中。當須要讀取數組中的數據時,須要提供數組中的索引,而後數組根據索引將內存中的數據取出來,返回給讀取程序。在Java中並非全部的數據都能存儲到數組中,只有相同類型的數據才能夠一塊兒存儲到數組中。學習

面試官:講一講你對數據結構——數組、鏈表、棧、隊列的理解

全部的數據結構都支持幾個基本操做:讀取、插入、刪除。

由於數組在存儲數據時是按順序存儲的,存儲數據的內存也是連續的,因此他的特色就是尋址讀取數據比較容易,插入和刪除比較困難。簡單解釋一下爲何,在讀取數據時,只須要告訴數組要從哪一個位置(索引)取數據就能夠了,數組會直接把你想要的位置的數據取出來給你。插入和刪除比較困難是由於這些存儲數據的內存是連續的,要插入和刪除就須要變動整個數組中的數據的位置。舉個例子:一個數組中編號0->1->2->3->4這五個內存地址中都存了數組的數據,但如今你須要往4中插入一個數據,那就表明着從4開始,後面的全部內存中的數據都要日後移一個位置。這但是很耗時的。

面試官:講一講你對數據結構——數組、鏈表、棧、隊列的理解

3、鏈表

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

面試官:講一講你對數據結構——數組、鏈表、棧、隊列的理解

因爲鏈表是以這種方式保存數據,因此鏈表在插入和刪除時比較容易,讀取數據時比較麻煩。舉個例子:一個鏈表中0->1->2->3->4這五個內存地址中都存了數據,如今須要往2中插入一條數據,那麼只須要更改1號和2號中記錄下一個數據的位置就好了,對其餘數據沒有影響。刪除一條數據與插入相似,很高效。可是若是是想要在鏈表其中取出一條數據,就須要從0號開始一個一個的找,直到找到想要的那條數據爲止。

鏈表中插入

鏈表中刪除

4、棧

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

在取出棧中的數據的時候會先取出最上面的數據,因此是先進後出。

面試官:講一講你對數據結構——數組、鏈表、棧、隊列的理解

因爲數組和鏈表均可以組成棧,因此操做特色就須要看棧是由數組仍是鏈表生成的了,而後就會繼承相應的操做特色。

5、隊列

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

面試官:講一講你對數據結構——數組、鏈表、棧、隊列的理解

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

相關文章
相關標籤/搜索