堆疊是一種執行「後進先出」演算法的資料結構。
設想有乙個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以「先進後出」就是這種結構的特點。
堆疊就是這樣一種資料結構。它是在記憶體中開闢乙個儲存區域,資料乙個乙個順序地存入(也就是「壓入——push」)這個區域之中。有乙個位址指標總指向最後乙個壓入堆疊的資料所在的資料單元,存放這個位址指標的暫存器就叫做堆疊指示器。開始放入資料的單元叫做「棧底」。資料乙個乙個地存入,這個過程叫做「壓棧」。在壓棧的過程中,每有乙個資料壓入堆疊,就放在和前乙個單元相連的後面乙個單元中,堆疊指示器中的位址自動加1。讀取這些資料時,按照堆疊指示器中的位址讀取資料,堆疊指示器中的位址數自動減 1。這個過程叫做「彈出pop」。如此就實現了後進先出的原則。
堆疊是計算機中最常用的一種資料結構,比如函式的呼叫在計算機中是用堆疊實現的。
堆疊可以用陣列儲存,也可以用以後會介紹的鍊錶儲存。
下面是乙個堆疊的結構體定義,包括乙個棧頂指標,乙個資料項陣列。棧頂指標最開始指向-1,然後存入資料時,棧頂指標加1,取出資料後,棧頂指標減1。
堆和棧是兩個不同的概念。
簡單的來講堆(heap)上分配的記憶體,系統不釋放,而且是動態分配的。棧(stack)上分配的記憶體系統會自動釋放,它是靜態分配的。執行時棧叫堆疊。棧的分配是從記憶體的高位址向低位址分配的,而堆則相反。
由malloc或new分配的記憶體都是從heap上分配的記憶體,從heap上分配的記憶體必須有程式設計師自己釋放,用free來釋放,否則這塊記憶體會一直被占用而得不到釋放,就出現了「記憶體洩露(memory leak)」。這樣會造成系統的可分配記憶體的越來越少,導致系統崩潰。
題外:很多人認為在程式中盡量使用堆而不使用棧,因為堆疊溢位很危險。其實堆溢位比棧溢位更危險。哈哈~!
堆,棧,佇列的一些淺薄的理解
一些自己理解的概念 1 記憶體 記憶體是計算機重要的部件之一,任何程式都需要在記憶體中執行,是與cpu和外部儲存裝置資料溝通的橋梁。在計算機執行的過程中,cpu會把記憶體中的資料進行運算,當執行結束後,cpu會把迅速按結果暫時輸出到記憶體。所以記憶體也決定著計算機的穩定執行。3 常用的資料結構 陣列...
關於堆,棧的一些東西
堆和棧的區別 1 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 u 1 棧區 stack 由編譯器自動分配釋放 由編譯器在需要的時候分配,在不需要的時候自動清除 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。u 2 堆區 heap 一般由程式...
更新一些堆疊的操作實現
堆疊的實現包括有使用指標的實現方式和使用陣列的實現方式。下面為指標的實現方式 堆疊也叫做lifo結構 堆疊的基本操作包括清空棧和判斷是否是空棧都是棧的操作的一部分 棧頂是唯一可見的操作 棧的本質其實也是乙個表,任何表的方法都可以用來實現棧 棧的實現包括兩種流行的方法,一種是使用指標來實現,另一種是使...