什麼是堆?什麼是棧翱,什麼是堆?什麼是棧啊?

2021-08-16 03:09:13 字數 5262 閱讀 3492

1樓:暴走少女

堆(英語:heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是一個可以被看做一棵樹的陣列物件。

棧(stack)又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。

向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。

擴充套件資料:

一、堆的演算法思想

不必將值一個個地插入堆中,通過交換形成堆。假設根的左、右子樹都已是堆,並且根的元素名為r。這種情況下,有兩種可能:

(1) r的值小於或等於其兩個子女,此時堆已完成。

(2) r的值大於其某一個或全部兩個子女的值,此時r應與兩個子女中值較小的一個交換,結果得到一個堆,除非r仍然大於其新子女的一個或全部的兩個。這種情況下,我們只需簡單地繼續這種將r「拉下來」的過程,直至到達某一個層使它小於它的子女,或者它成了葉結點。

二、棧的基本演算法

1、進棧(push)演算法

①若top≥n時,則給出溢位資訊,作出錯處理(進棧前首先檢查棧是否已滿,滿則溢位;不滿則作②)。

②置top=top+1(棧指標加1,指向進棧地址)。

③s(top)=x,結束(x為新進棧的元素)。

2、退棧(pop)演算法

①若top≤0,則給出下溢資訊,作出錯處理(退棧前先檢查是否已為空棧, 空則下溢;不空則作②)。

②x=s(top),(退棧後的元素賦給x)。

③top=top-1,結束(棧指標減1,指向棧頂)。

2樓:利漆

什麼是堆和棧?

一個由c/c++編譯的程式佔用的記憶體分為以下幾個部分

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列,呵呵。

3、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 - 程式結束後有系統釋放

4、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放

5、程式**區—存放函式體的二進位制**。

函式壓棧是怎麼回事?

函式壓棧的本質是引數傳遞

這又跟組合語言連繫起來了.組合語言的過程即proc可以理解成函式

比如一個最簡單的計算兩數之和函式

如果用匯編來寫估計是這樣的

sub proc

pop ax ;從stack取a 並放在ax暫存器中

pop bx ;從stack取b 並放在bx暫存器中

add ax,bx ; 計算a+b

ret //返回

sub endp

顯然要呼叫這個函式,你應當先把b值push進stack,然後再push a

因為stack是先進後出的

所以呼叫匯編像這樣

比如計算4+5

push 5;

push 4;

call sub; //返回值在ax中

在這個例子中先壓5或先壓4得到的結果沒有變化

但大多數程式,如果引數的順序錯誤將是災難性的

因為不管什麼高階語言最終都要編譯成組合語言,然後是機器語言

同樣下面這個c程式,計算a+b值,必然會編譯成上面的彙編**

int sub(int a ,int b)

所以c在呼叫這個函式sub時,必須要壓棧(即傳入引數)但這些工作,在c語言裡,並不需要你來完成.你只要寫出

sub(7,9);

編譯器在編譯成彙編時就會自動完成相關的壓棧工作.

根據函式呼叫方式和引數壓入順序目前存在三種約定:

stdcall

cdecl

fastcall

這都相關壓棧順序和棧的清理工作約定

他們的細節都不相同,但有一點是肯定的,引數比須從右向左壓入棧中

stdcall中 函式必須自已清理棧

cdecall 由呼叫者清除堆疊 c的預設函式呼叫方式 所以這樣c支援可變引數

fastcall 是把函式引數列表的前三個引數放入暫存器eax,edx,ecx,其他引數壓棧

源**:

int function(int a, int b)

void main()

1.__cdecl

_function

push ebp

mov ebp, esp

mov eax, [ebp+8] ;引數1

add eax, [ebp+c] ;加上引數2

pop ebp

retn

_main

push ebp

mov ebp, esp

push 14h ;引數 2入棧

push 0ah ;引數 1入棧

call _function ;呼叫函式

add esp, 8 ;修正棧

xor eax, eax

pop ebp

retn

2.__fastcall

@function@8

push ebp

mov ebp, esp ;儲存棧指標

sub esp, 8 ;多了兩個區域性變數

mov [ebp-8], edx ;儲存引數 2

mov [ebp-4], ecx ;儲存引數 1

mov eax, [ebp-4] ;引數 1

add eax, [ebp-8] ;加上引數 2

mov esp, ebp ;修正棧

pop ebp

retn

_main

push ebp

mov ebp, esp

mov edx, 14h ;引數 2給edx

mov ecx, 0ah ;引數 1給ecx

call @function@8 ;呼叫函式

xor eax, eax

pop ebp

retn

3.__stdcall

_function@8

push ebp

mov ebp, esp

mov eax, [ebp] ;引數 1

add eax, [ebp+c] ;加上引數 2

pop ebp

retn 8 ;修復棧

_main

push ebp

mov ebp, esp

push 14h ;引數 2入棧

push 0ah ;引數 1入棧

call _function@8 ;函式呼叫

xor eax, eax

pop ebp

retn

3樓:尨蓇厵菭

堆,佇列優先,先進先出(fifo—first in first out) ;

棧,先進後出(filo—first-in/last-out)。

在計算機領域,堆疊是一個不容忽視的概念,堆疊是兩種資料結構。堆疊都是一種資料項按序排列的資料結構,只能在一端(稱為棧頂(top))對資料項進行插入和刪除。在微控制器應用中,堆疊是個特殊的儲存區,主要功能是暫時存放資料和地址,通常用來保護斷點和現場。

堆疊空間分配

棧(作業系統):由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

堆(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**,分配方式倒是類似於連結串列。

效率比較

棧由系統自動分配,速度較快。但程式設計師是無法控制的。

堆是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便.

4樓:小蔥花

堆疊解析大全

抽象篇:

記憶體的地址從0開始到最大

堆就是記憶體地址從最大向0的方向遞減

棧就是記憶體地址從0向最大的方向遞增

通俗篇:

棧是指只能從一邊存入和取出資料

隊是指一邊存入另一邊取出

實戰篇:

堆(heap)是系統中可供程式自由動態分配的記憶體空間,c中用malloc來從堆中取得一塊記憶體,用free釋放。

棧(stack)是一種資料結構,先進先出。可以在程式中自己建立,還有函式棧,是系統呼叫函式時臨時分配的記憶體空間,用來保留一些必要的資料,函式執行後釋放。

理論篇:

堆疊都是一種資料項按序排列的資料結構,只能在一端(稱為棧頂(top))對資料項進行插入和刪除。要點:堆:

順序隨意,先進後出可以,先出後行也行。棧:後進先出(last-in/first-out)

縮水篇:

new操作的記憶體在堆空間;而int a;類似的變數的記憶體在棧空間。

推薦篇:

5樓:匿名使用者

堆(heap)是系統中可供程式自由動態分配的記憶體空間,c中用malloc來從堆中取得一塊記憶體,用free釋放。

棧(stack)是一種資料結構,先進先出。可以在程式中自己建立,還有函式棧,是系統呼叫函式時臨時分配的記憶體空間,用來保留一些必要的資料,函式執行後釋放。

6樓:

堆疊都是一種資料項按序排列的資料結構,只能在一端(稱為棧頂(top))對資料項進行插入和刪除。要點:堆:

順序隨意,先進後出可以,先出後行也行。棧:後進先出(last-in/first-out)

什麼是堆疊 堆和棧有什麼不同

在片內ram中,常常要指定一個專門的區域來存放某些特別的資料,它遵循順序存取和後進先出 lifo filo 的原則,這個ram區叫堆疊。子程式呼叫和中斷服務時cpu自動將當前pc值壓棧儲存,返回時自動將pc值彈棧 保護現場 恢復現場 資料傳輸。堆是堆 heap 棧是棧 stack 雖然堆疊 heap...

DNF固傷職業堆什麼?百分比職業堆什麼?什麼影響最大

百分百是看你的面板,的強化對那有加成,而固傷就是你技能的傷害是固定的,就算你不哪 也是那傷害,力量和智力對那有加成!一個和你面板攻擊有關 一個和力量或者智力的高低有關 還有不懂的可以追問,如果解決你的問題,請給我最佳,謝謝 dnf 百分比與固傷職業是什麼?很多人都不知道,亂增幅強化 百分比是看物攻或...

甲乙兩堆貨物,甲堆貨物的數量是乙堆的3倍,現將甲堆的3 8給乙堆,這是乙堆比甲堆多,此時乙堆再給甲堆幾分之幾

這個問題,標準不同,給出的答案就不同。不過按照出題者的思路,應該是以第一次分配後乙堆作為再次分配的標準。因此,此時乙堆再給甲堆1 17 兩堆就一樣多了設甲為1,乙為1 3 那麼第一步之後甲變為 15 24,乙變為17 24這時候乙為1,那麼甲就是15 17 想要一樣多,乙就拿出1 17 假設甲堆數量...