什么是堆棧?
在計算機領域,堆棧是一個不容忽視的概念,但是很多人甚至是計算機專業的人也沒有明確堆棧其實是兩種數據結構。
堆棧都是一種數據項按序排列的數據結構,只能在一端(稱為棧頂(top))對數據項進行插入和刪除。
要點:
堆:順序隨意
棧:后進先出(Last-In/First-Out)
什么叫堆棧
堆棧其實是數據結果中的兩個概念 ,是存放數據的方式。
堆:順序隨意。
棧:后進先出(Last-In/First-Out)。
要說用處,那就是在寫代碼的時候,有時數據存取肯定是要有規定的順序的,這個是你自己規定的,然后按照你所寫程序的用處的特點來用堆還是棧還是隊列之類的順序。
如果我的回答幫到了你,請點“采納”。
什么是堆棧
堆是堆(heap),棧是棧(stack),雖然堆棧(heap and stack)有相似之處,但不要混為一談。
本質上講,堆(heap)是一種數據結構,是純軟件的實現。堆基于一定的程序基礎(例如在操作系統),它更加偏向于軟件實現動態的內存管理,令程序運行時根據所需來動態申請/釋放內存。
而棧(stack)既存在軟件實現又存在硬件實現。棧本質上是一種簡單的先進先出結構,主要目的是為程序運行時保存關鍵的現場數據,尤其適合于(嵌套式)中斷的配合。幾乎所有的微控制器/微處理器都具備硬件棧。而軟件/操作系統中又可以進一步建立軟件棧,為線程建立專用的存儲區域。
什么叫堆棧
堆和棧是兩個不同的概念。
堆(heap)上分配的內存,系統不釋放,而且是動態分配的。棧(stack)上分配的內存系統會自動釋放,它是靜態分配的。運行時棧叫堆棧。棧的分配是從內存的高地址向低地址分配的,而堆則相反。由malloc或new分配的內存都是從heap上分配的內存,從heap上分配的內存必須有程序員自己釋放,用free來釋放,否則這塊內存會一直被占用而得不到釋放,就出現了“內存泄露(Memory
Leak)”。這樣會造成系統的可分配內存的越來越少,導致系統崩潰。
堆棧是一種執行“后進先出”算法的數據結構。
設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒里面,可以發現一種規律:先放進去的小球只能后拿出來,反之,后放進去的小球能夠先拿出來。所以“先進后出”就是這種結構的特點。
堆棧就是這樣一種數據結構。它是在內存中開辟一個存儲區域,數據一個一個順序地存入(也就是“壓入——push”)這個區域之中。有一個地址指針總指向最后一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入數據的單元叫做“棧底”。數據一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的后面一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減
1。這個過程叫做“彈出pop”。如此就實現了后進先出的原則。
而堆棧寄存器就是存放堆棧的寄存器。
“堆棧”是什么意思?
堆棧是一種執行“后進先出”算法的數據結構。
設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒里面,可以發現一種規律:先放進去的小球只能后拿出來,反之,后放進去的小球能夠先拿出來。所以“先進后出”就是這種結構的特點。
堆棧就是這樣一種數據結構。它是在內存中開辟一個存儲區域,數據一個一個順序地存入(也就是“壓入——push”)這個區域之中。有一個地址指針總指向最后一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入數據的單元叫做“棧底”。數據一個一個地存入,這個過程叫做“壓棧”。在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的后面一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減 1。這個過程叫做“彈出pop”。如此就實現了后進先出的原則。
堆棧是計算機中最常用的一種數據結構,比如函數的調用在計算機中是用堆棧實現的。
堆棧可以用數組存儲,也可以用以后會介紹的鏈表存儲。
下面是一個堆棧的結構體定義,包括一個棧頂指針,一個數據項數組。棧頂指針最開始指向-1,然后存入數據時,棧頂指針加1,取出數據后,棧頂指針減1。
#define MAX_SIZE 100
typedef int DATA_TYPE;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};
堆棧是什么意思
類似于隊列,堆棧是個簡單的數據存儲結構。堆棧中數據進出的順序很重要,舉個例子,餐廳的盤子堆,盤子洗完要堆到上面,而不是插到下面的某個位置(相信不會有人那么做)。當廚師要用到盤子時從最上面的開始拿。即最先放在堆里的盤子會被最后一個用到。
定義:堆棧就是只能在一端插入和刪除數據的鏈表,這個端就叫做棧頂(top),最后一個添加的數據第一個被刪除。因此,這也叫后進先出(LAST IN FIRST OUT)鏈表或是先進后出鏈表(FIRST IN LAST OUT)。
對于堆棧有兩種操作:
進棧指令(PUSH):在棧中現有元素頂部添加一個元素,新加入的元素變為最頂端的元素。
出棧指令(POP):取出棧頂元素,刪除棧中的這個元素。
有些情況下,棧的最大長度有限。如果棧中元素已經達到最大長度,再用進棧指令會造成堆棧上溢出(stack overflow),相似的,如果堆棧已空還用出棧指令會造成堆棧下溢出(stack underflow)。