導讀:今天看視頻,就看到了堆、棧這一塊了。記得當年初相見(VB視頻),劈頭蓋臉一陣蒙,什么都不知道,那時候師傅叫我掛起來,說我隨着學習的進度,慢慢的就會懂了。現在,學到了這里,想着自己對自己從前的問題進行解答。可能解答的不夠完整不夠好,等到我又學了新東西,又有了想法的時候,再回頭更改。嘿嘿,先看看當年的問題哈。
一:基本定義
堆(heap):堆是一種經過排序的樹形數據結構,每個結點都有一個值。
棧(stack):它是一種具有后進先出性質的數據結構,也就是說后存放的先取,先存放的后取。(PS:頗有砌牆的磚——后來者居上的趕腳。)
堆棧:由堆和棧的概念,可以清晰的知道:堆棧,是一種數據項按序排列的數據結構,只能在一端(稱為棧頂(top))對數據項進行插入和刪除。
PS:結合查閱的資料,通常所說的堆棧,實際上更偏向於指棧。
二、基本對比
1,申請方式
heap:程序員自己申請,並指明大小。
stack:由系統分配。
2,申請效率
原為:
heap:效率較高,速度較快,但程序員無法對其進行控制。
stack:由new分配的內存,相對效率和速度都較低,且容易產生碎片,但由於是程序員自己申請操作,靈活性強,使用方便。
更改:2017-08-23 3:25pm
stack:效率較高,速度較快,但程序員無法對其進行控制。
heap:由new分配的內存,相對效率和速度都較低,且容易產生碎片,但由於是程序員自己申請操作,靈活性強,使用方便。
3,存儲的數據類型
stack:存儲值類型,即存儲固定長度的數據。比如:整數、字符、結構、布爾、枚舉等。每個程序在執行時都有自己的堆棧,其他程序不能訪問該堆棧。
heap:存儲引用類型。比如:類、接口、數組等。
PS:在網上搜索的資料還有很多,但結合視頻,目前自己理解的就只有這些咯。
三、相關名詞
1,壓棧(進棧、入棧):用push表示,就是把數據放入棧中,從棧頂放入,有先進后出的特點!
2,清棧:清空棧中所有的數據。
3,出棧:用POP表示,它是和壓棧相反的概念,即把數據從棧中取出來。出棧時從棧頂取出。
形象化解釋:有二層樓,拿着磚頭,繼續往上蓋樓,就是壓棧。取下磚頭拆樓,硬生生把樓房給弄成平房,就是出棧。然后,要是看這座樓不順眼,直接給炸了,灰都不剩那種,就叫清棧。
注意問題:壓棧:需要考慮是否滿棧,比如一座樓根據地基的承受能力,目前高度達到了極限,那么,就不能往上繼續蓋。
清棧:需要考慮棧是否為空,空棧,不需要清棧。
出棧:每次出棧都只能出頂棧。(PS:我在想出棧是不是得留下點東西,要是什么都不留,豈不成了清棧了)
4,堆棧溢出:就是不顧堆棧中分配的局部數據塊大小,向該數據塊寫入了過多的數據,導致數據越界,結果覆蓋了舊的堆棧數據。 (PS:有點像數組的下標越界問題)
四、個人感受
總算是對以前VB中的遺留問題,做了一丟丟的解答了,雖然還不夠全面,但目前很滿足了。才發現,有的問題真的可以掛起來,隨着學習的深入,自己就會慢慢的了解。如果當時我就去糾結這么一個問題,我肯定會耽誤很長時間。其實,說到底,還是自己的知識積累不夠。
調侃的說:突然有點佩服我的記憶力了(老師不要說我哈,我知道記是記不住的,可是,我這回就是記住了)。真的,我一看視頻中出現的這個堆和棧的名詞,頓時就想到了我去年在今目標上發的問題更新協商,嘿嘿!因此,也就多留意了一下,查了很多資料,知道了很多擴展性的東西,這回,又把看不懂的掛起來了,神呀,我什么時候才能都懂了哦,賜予我力量吧,阿門。
在回頭看這個堆棧問題的時候,我也順便看了一下當時提出的別的一些問題,比如類的實例化個數問題、布爾型定義的問題、線程緩沖池(單線程、公寓式線程)、面向對象的繼承多態等問題。還記得當時師傅說:有些東西,它就是那樣的,沒有為什么。學到現在,真的就是那樣,沒有多余的為什么 ,他就是老師說的王八的屁股。繼續努力,覺得自己挺差勁的,那時候提出的一些問題,到現在,也都還剩了一大堆沒能解決掉,加油,總會有拋開問題全明白的一天。
請大家多多指教,謝謝!