一、什么是堆?(Heap)
堆是無序的,是一片不連續的內存域,由用戶自己來控制和釋放,如果用戶自己不釋放的話,當內存達到一定的特定值時,通過垃圾回收器(GC)來回收。
是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。
二、什么是棧?(Stack)
棧是有順序的,是一片連續的內存域,保持着先進后出的原則,由系統自動分配和維護。
是編譯期間就分配好的內存空間,因此代碼中必須就棧的大小有明確的定義。
表尾允許進行插入刪除操作,稱為棧頂(Top),另一端是固定的,稱為棧底(Bottom)。
PS:
線性表(Linear List)是具有相同特性的數據元素的一個有限序列。
堆棧(Stack) 是一種特殊的線性表,是一種操作只允許在尾端進行插入或刪除等操作的線性表。
順序棧(Sequence Stack)是用一片連續的存儲空間來存儲棧中的數據元素。
鏈棧(Linked Stack)是用鏈式存儲結構來存儲的棧,鏈棧通常用單鏈表來表示。
三、什么是堆棧?
由堆和棧的概念,可以清晰的知道,堆棧是一種數據項按序排列的數據結構,只能在一端稱為棧頂(top)對數據項進行插入和刪除。
最后一個放入堆棧中的物體總是被最先拿出來,這個特性通常稱為后進先出(LIFO)隊列。
堆棧中定義了一些操作,兩個最重要的是PUSH和POP。PUSH操作在堆棧的頂部加入一個元素,POP操作相反,在堆棧頂部移去一個元素, 並將堆棧的大小減一。
PS:通常所說的堆棧,實際上更偏向於指棧。
四、什么是隊列?(Queue)
隊列是一種特殊的線性表,它只允許在表的前端(Front)進行刪除操作,而在表的后端(Rear)進行插入操作。
進行插入操作的表尾稱為隊尾(Rear),把進行其他操作的頭部稱為隊頭(Front)。
隊列中沒有元素時,稱為空隊列,隊列具有先進先出(FIFO)的特點。
PS:
隊列(Queue)是插入操作限定在表的尾部而其他操作限定在表的頭部進行的線性表。
順序隊列(Sequence Queue)用一片連續的存儲空間來存儲隊列中的數據元素,類似於順序表,用一維數組來存放隊列中的數據元素。
循環順序隊列(Circular sequence Queue)解決順序隊列的假溢出的方法是將順序隊列看成是首位相接的循環結構。
鏈隊列(Linked Queue)隊列的另外一種存儲方式是鏈式存儲,通常用單鏈表表示。
五、堆、棧之間的區別是?
堆實際上指的就是(滿足堆性質的)優先隊列的一種數據結構,第一個元素有最高的優先權
棧實際上就是滿足先進后出的性質的數學或數據結構。
1、堆棧空間分配
棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。
堆(操作系統):一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
2、堆棧緩存方式
棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(並不是一旦成為孤兒對象就能被回收)。所以調用這些對象的速度要相對來得低一些。
3、堆棧數據結構區別
堆(數據結構):堆可以被看成是一棵樹,如:堆排序。
棧(數據結構):一種先進后出的數據結構。
特性: 最后一個放入堆棧中的物體總是被最先拿出來, 這個特性通常稱為后進先出(LIFO)隊列。
六、堆、棧、隊列之間的區別是?
堆是在程序運行時,而不是在程序編譯時,申請某個大小的內存空間。即動態分配內存,對其訪問和對一般內存的訪問沒有區別。
棧就是一個桶,后放進去的先拿出來,它下面本來有的東西要等它出來之后才能出來。(先進后出or后進先出)
隊列只能在隊頭做刪除操作,在隊尾做插入操作.而棧只能在棧頂做插入和刪除操作。(先進先出)