首先,明確兩個概念:數據結構與數據存儲結構!
數據結構:是指相互之間存在一種或多種特定關系的數據元素的 集合。聽起來是不是很抽象,簡單理解:數據結構就是描述對象間邏輯關系的學科。比如:隊列就是一種先進先出的邏輯結構,棧是一種先進后出的邏輯結構,家譜 是一種樹形的邏輯結構!(初學數據結構的時候很不理解為什么有“棧”這個東西;隊列很容易理解---無論購物就餐都需要排隊;棧可以認為就是個棧道--- 只允許一個人通過的小道,而且只能從一端進入,然后再從這端返回,比如你推了個箱子進去啦,第二個人也推個箱子進去,此時只能等后進來的這個人拉着箱子出 去后,你才能退出。)
數據存儲結構:它是計算機的一個概念,簡單講,就是描述數據在計算機中存儲方式的學科;常用的數據存儲 方式就兩種:順序存儲,非順序存儲!順序存儲就是把數據存儲在一塊連續的存儲介質(比如硬盤或內存)上----舉個例子:從內存中拿出第100個字節到 1000個字節間的連續位置,存儲數據;數組就是典型的順序存儲!非順序存儲就是各個數據不一定存在一個連續的位置上,只要每個數據知道它前面的數據和后 面的數據,就能把所有數據連續起來啦;鏈表就是典型的非順序存儲啦!
至此,基本就應該明白它們之間的區別了吧!
隊列、棧是線性數據結構的典型代表,而數組、鏈表是常用的兩種數據存儲結構;隊列和棧均可以用數組或鏈表的存儲方式實現它的功能!
//========================簡單分析===============================
數 組屬於順序存儲中,由於每個元素的存儲位置都可以通過簡單計算得到,所以訪問元素的時間都相同(直接訪問數組下標);鏈表屬於數據的鏈接存儲,由於每個元 素的存儲位置是保存在它的前驅或后繼結點中的,所以只有當訪問到其前驅結點或后繼結點后才能夠按指針訪問到自己,訪問任一元素的時間與該元素結點在鏈接存 儲中的位置有關。
鏈表和數組是常用的兩種數據存儲結構,都能用來保存特定類型的數據。兩者存在着一些差異:
1.占用的內存空間
鏈表存放的內存空間可以是連續的,也可以是不連續的,數組則是連續的一段內存空間。一般情況下存放相同多的數據數組占用較小的內存,而鏈表還需要存放其前驅和后繼的空間。
2.長度的可變性
鏈表的長度是按實際需要可以伸縮的,而數組的長度是在定義時要給定的,如果存放的數據個數超過了數組的初始大小,則會出現溢出現象。
3.對數據的訪問
鏈表方便數據的移動而訪問數據比較麻煩;數組訪問數據很快捷而移動數據比較麻煩。
鏈表和數組的差異決定了它們的不同使用場景,如果需要很多對數據的訪問,則適合使用數組;如果需要對數據進行很多移位操作,則設和使用鏈表。
上面提到的都是棧,而不是堆棧,那堆棧是什么呢?
首先,堆棧是計算機語言中常用術語,堆棧是棧的俗稱!
比如在Java中我們常常說堆棧什么什么的,其實就是說棧內信息!此時有人就問:Java中明明有堆和棧兩個概念呀?!不錯,堆和棧的確是兩種不同的內存操作單元,它們用途不同,但堆棧就是棧的俗稱,你可以理解它其實就是棧!
堆和棧有什么區別:
1. 棧具有數據結構中棧的特點,后進先出,所有存放在它里面的數據都是生命周期很明確(當然要求它不能存放太久,占有的空間確定而且占用空間小),能夠快速反應的!所有在Java中它存放的是8個基本數據類型和引用變量的,用完就馬上銷毀
2. 堆可以理解它就是個一個可大可小,任你分配的聽話的內存操作單元;因此它的特點就是動態的分配內存,適合存放大的數據量!比如一個對象的所有信息,雖然它的引用指向棧中的某個引用變量;所有Java中堆是存放new出來的對象的。
堆和棧因為不同的特性,所有在計算機中應用甚廣!