簡單理解內存中的堆棧與數據結構中的堆棧

一日中午,平靜的辦公室忽然發出這樣一個聲音:什麼是堆棧?
於是瞬間,辦公室開始鬧騰起來
A:堆棧就是後進後出
B:堆就是時間犧牲空間,棧就是空間犧牲時間
C:棧更快,堆就略微慢一點
D:……
作爲剛畢業的碼畜,聽完之後就有些懵逼了(WTF,堆棧還有這麼多東西嗎?),於是上網搜尋各種資料,發現了一個在大學知識容易混淆的知識點,那就是——數據結構中的堆棧與內存中的堆棧存儲是不同的


數據結構中的堆棧

先說數據結構中的堆棧,這個就是我們大學課程《數據結構》中所學到的,通俗上的堆棧的理解,堆和棧是數據存儲方式的兩種數據結構。關於堆棧,其實還有一個比較容易搞混的地方那就是隊列,其實這三種都是數據結構中的一種排序數據結構
- :堆的數據機構其實就是一個完全二叉樹,具堆屬性的數據結構纔可被叫做爲堆,堆常見的應用就是堆排序與實現優先隊列,爲什麼用?因爲快啊
- 隊列:就是先進先出的存儲方式,類似與超市付款,先買的先走,一般與棧作比較
- :與隊列相反,棧的順序是後進先出,只可以在棧頂進行操作,類似與只有一個出入口的公交車,先上車的只能後來下車
速度
隊列與棧速度相對來說,隊列的更快些,因爲設計增加刪除的操作時,隊列不需要改變數據結構,而棧需要,所以遍歷速度略低些,這些數據結構一般跟算法有點關係,其實平時敲代碼用不到的好不

以上就是數據結構中的堆棧,接下來說下內存中的堆和棧

內存中的堆和棧

在內存中的堆棧,一般指的是數據操作的存在位置,一般來說,棧是存放一些常量字面量一類的東西,這些一般有系統自己控制空間的開闢與釋放,而堆是存放一些實例的變量,程序員需要自己去控制何時在內存中分配空間和何時釋放(當然,這個也跟語言有關係,java就由虛擬機自行控制,c++就不行了)
速度
關於速度,查閱資料,棧的存儲一般位於一級緩存,堆的存儲位於二級緩存,所以棧的速度是遠遠大於堆的。(關於一級緩存二級緩存的速度差異請看這個:http://www.to8to.com/yezhu/v9652.html
什麼是堆棧溢出
堆棧溢出就是不顧堆棧中分配的局部數據塊大小,向該數據塊寫入了過多的數據,導致數據越界,結果覆蓋了別的數據。意思就是,假如你在內存分配了8大小,而傳入的值卻大於這個長度,那麼多餘的長度就可能會覆蓋內存中的其他元素,所以會得到錯誤的返回結果。堆棧溢出一般指的是堆溢出,棧溢出的情況比較少。


前端新手,弱雞一枚,如有錯誤,請指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章