Java數據結構之線性表

這篇文章咱們來講說Java裏一個很重要的數據結構——線性表,仍是這張圖,線性表對應着下圖裏的List。java

紅框裏的內容就是線性表的你們族了,其中黃色部分是要重點了解的,線性表裏的元素是按線性排列的(這裏的線性指邏輯上的) 線性表分爲兩大類,分別是順序表和鏈表數組

1、順序表

順序表中的數據元素存儲是連續的,內存劃分的區域也是連續的。存儲結構以下圖:數據結構

咱們的ArrayList底層是數組實現的,底層元素在內存中是按順序排列的,ArrayList是Java中順序表的體現。spa

2、鏈表

鏈表在物理存儲上一般是非連續、非順序的方式存儲的,數據元素的邏輯順序是經過鏈表中的引用來實現的。3d

一、單向鏈表

很簡單,內存中的對象是隨機分佈的,對象不但存儲了張3、李四等數據,還持有一個next引用,指向下一個對象,來肯定一組對象的邏輯順序。code

二、循環鏈表

也很簡單,和單向鏈表同樣,只不過最後一個對象的next又指向了第一個對象。對象

三、雙向鏈表

不但持有next引用,指向下一個對象,還持有一個prev引用,指向上一個對象。blog

記住雙向鏈表這個圖,很重要,下一篇文章咱們要講的LinkedList就是以雙向鏈表的方式實現的。接口

3、棧和隊列

棧和隊列是兩種比較特殊的線性表。隊列

一、

棧是一種操做受限制的線性表。其限制是僅容許在線性表的尾部進行添加和刪除操做,這一端被稱爲棧頂,另外一端稱爲棧底。向一個棧添加新元素叫壓棧,刪除元素又稱爲出棧

如上圖,把趙六放入到棧中叫壓棧,不放入趙六,直接取出(刪除)王五的過程叫出棧,只能從棧頂放入和刪除元素。本文第一張圖裏的Stack就是棧在Java中的實現。舉個例子,最後洗好的盤子都是疊放在最上面的,但每次用的時候都是從最上面拿,最早洗好的盤子反而不容易用到。

二、隊列

隊列也是一種操做受限制的線性表。只能從頭部刪除(取出)元素,從隊尾添加元素,進行刪除操做的端稱爲隊頭。

看上面的圖,只能從隊尾添加元素,隊頭取出(刪除)元素。本文第一張圖裏的Queue就是隊列的體現,Queue是基於鏈表來體現的。注意,Queue是一個接口,直接寫以下代碼是會報錯的

Queue queue = new Queue();//會報錯,Queue是接口,不容許實例化

正確的用法是

Queue queue = new LinkedList();//  正確的用法,基於鏈表來實現

隊列的鏈表實現是經過子類LinkedList來實現的,Queue接口收窄了LinkedList的訪問權限,只提供從隊尾,隊頭等的操做。

爲了加深你們的印象,我舉一個例子,噁心了一點,但保證你們能記住,你們在喝啤酒的過程當中,正常去廁所小解的,這個過程叫作隊例。喝多了吐出來的過程,叫作棧

相關文章
相關標籤/搜索