一、數據結構上的堆棧、操作系統上的堆棧,匯編語言的堆棧、還有C語言本身的堆棧的區別
數據結構中棧,先進后出的一種結構,而堆指的是優先隊列,帶優先級的隊列。
c語言的堆棧,是指一個程序運行起來系統給分配的區域,總共5個,堆棧區,簡稱棧區,系統自動釋放的區域。堆區,需要程序員自己手動開辟和釋放(malloc,free)的區域、靜態區(全局區)static、常量區(字符串常量等)、代碼區。(這里指的是用戶棧了)
匯編語言中堆棧的作用當出現參數太多,寄存器不夠用時,暫時存儲到的地方。
操作系統堆棧(系統棧)的作用主要是調用子程序時暫存斷點地址和保護(恢復)現場數據。
這幾個堆棧說通俗作用基本上暫時存放數據和地址,保護現場和斷點么,名字一樣不是沒原因的。
c程序最終還不是要轉化為匯編來執行。
特別的,數據結構中的堆:
堆實際上指的就是(滿足堆性質的)優先隊列的一種數據結構,第1個元素有較高的優先權。
堆性質:葉子節點小于(或大于)父親節點,則為小(大)頂堆。
數據結構中的堆可以用一個數組來存儲(完全二叉樹結構。)棧實際上就是滿足先進后出的性質的數學或數據結構。
操作系統中的堆:
這里的堆是屬于內存分配方式的一種:動態分配內存。
實現的方式更接近于鏈表。堆內存中有很多塊內存,可能不是連續的。所有需要用鏈表來組織在分配的時候,有多種策略。首先查找是否有空閑的并且滿足大小的堆內存,然后把最大的那塊給需求者。這里有點像數據結構中堆的優先權。
操作系統中堆和棧的區別:
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
2、堆區(heap)— 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表。
延伸閱讀:
二、堆棧的基本概念
堆棧是一種特殊的線性表,堆棧的數據元素以及數據元素間的邏輯關系和線性表完全相同,其差別是:線性表允許在任意位置插入和刪除數據元素操作,而堆棧只允許在固定一端進行插入和刪除數據元素操作
根據堆棧的定義,每次進棧的數據元素都放在原當前棧頂元素之前而成為新的棧頂元素,每次退棧的數據元素都是原當前棧頂元素,這樣,最后進入堆棧的數據元素總是最先退出堆棧,因此,堆棧也稱作后進先出的線性表,或簡稱后進先出表。