堆疊是什麼~!
1樓:用又琴
堆疊是一種執行「後進先出」演算法的資料結構。
設想有乙個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裡面,可以發現一種規律:
先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以「先進後出」就是這種結構的特點。
堆疊就是這樣一種資料結構。它是在記憶體中開闢乙個儲存區域,資料乙個乙個順序地存入(也就是「壓入——push」)這個區域之中。有乙個位址指標總指向最後乙個壓入堆疊的資料所在的資料單元,存放這個位址指標的暫存器就叫做堆疊指示器。
開始放入資料的單元叫做「棧底」。資料乙個乙個地存入,這個過程叫做「壓棧」。在壓棧的過程中,每有乙個資料壓入堆疊,就放在和前乙個單元相連的後面乙個單元中,堆疊指示器中的位址自動加1。
讀取這些資料時,按照堆疊指示器中的位址讀取資料,堆疊指示器中的位址數自動減 1。這個過程叫做「彈出pop」。如此就實現了後進先出的原則。
堆疊是計算機中最常用的一種資料結構,比如函式的呼叫在計算機中是用堆疊實現的。
堆疊可以用陣列儲存,也可以用以後會介紹的連結串列儲存。
下面是乙個堆疊的結構體定義,包括乙個棧頂指標,乙個資料項陣列。棧頂指標最開始指向-1,然後存入資料時,棧頂指標加1,取出資料後,棧頂指標減1。
#define max_size 100
typedef int data_type;
struct stack
data_type data[max_size];
int top;
2樓:網友
堆疊是微控制器內具有特定用途的一塊記憶體區,試想一下,微控制器當前正在執行一段程式,突然來了中斷,cpu要放下當前的工作去處理中斷,完成以後在繼續執行原來的工作。
為了完成這個工作,轉入中斷以前,首先需要將當前程式的位置儲存起來,進入中斷程式以後,為了不破壞原來的工作現場,需要將用到的資源進行保護,又需要將它們儲存起來,中斷結束的時候,需要將儲存起來的資料恢復到相應的工作暫存器中,最後將儲存起來的中斷斷點位置送入程式指標,恢復原程式的工作。這個過程中需要儲存的資料放到什麼方呢,就是堆疊中,push指令就是將某個單元壓入堆疊的指令,pop就是將堆疊中的資料彈出並送回pop後面指定的單元中,堆疊指標同時作相應的改動。
堆疊是處理中斷必不可少的記憶體資源。
堆和棧的區別
3樓:陸澤仍雅麗
管理方式:對於棧來講,是由編譯器自動管理,無需我們手工控制;對於堆來說,釋放工作由程式設計師控制,容易產生memory
leak。申請大小:
棧:在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在windows下,棧的大小是2m(也有的說是1m,總之是乙個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。
因此,能從棧獲得的空間較小。
堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒記憶體位址的,自然是不連續的,而連結串列的遍歷方向是由低位址向高位址。
堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。
碎片問題:對於堆來講,頻繁的new/delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式效率降低。對於棧來講,則不會存在這個問題,因為棧是先進後出的佇列,他們是如此的一一對應,以至於永遠都不可能有乙個記憶體塊從棧中間彈出。
分配方式:堆都是動態分配的,沒有靜態分配的堆。棧有2種分配方式:
靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配由alloca函式進行分配,但是棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。
分配效率:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。
堆則是c/c++函式庫提供的,它的機制是很複雜的。
堆和棧的區別?
4樓:網友
棧是編譯期間就分配好的記憶體空間,因此你的**中必須就棧的大小有明確的定義;堆是程式執行期間動態分配的記憶體空間,你可以根據程式的運**況確定要分配的堆記憶體的大小。
堆,棧,堆疊這三個有什麼區別
5樓:五玉枝北羅
堆和棧的區別:
一、堆疊空間分配區別:
1、棧(作業系統):由作業系統自動分配釋放。
存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧;
2、堆(作業系統):
一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**,分配方式倒是類似於連結串列。
二、堆疊快取方式區別:
1、棧使用的是一級快取,他們通常都是被呼叫時處於儲存空間中,呼叫完畢立即釋放;
2、堆是存放在二級快取中,生命週期由虛擬機器的垃圾**演算法來決定(並不是一旦成為孤兒物件轎此清就能被**)。扒胡所以呼叫這些物件的速度要相對來得低一些。
三、堆疊資料結構區別:
堆(資料結構閉前):堆可以被看成是一棵樹,如:堆排序;
棧(資料結構):一種先進後出的資料結構。
堆和棧的區別是什麼
6樓:網友
堆和棧的區別:
一、堆疊空間分配區別:
1、棧(作業系統):由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧;
2、堆(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**,分配方式倒是類似於連結串列。
二、堆疊快取方式區別:
1、棧使用的是一級快取, 他們通常都是被呼叫時處於儲存空間中,呼叫完畢立即釋放;
2、堆是存放在二級快取中,生命週期由虛擬機器的垃圾**演算法來決定(並不是一旦成為孤兒物件就能被**)。所以呼叫這些物件的速度要相對來得低一些。
三、堆疊資料結構區別:
堆(資料結構):堆可以被看成是一棵樹,如:堆排序;
棧(資料結構):一種先進後出的資料結構。
堆和棧有什麼區別
7樓:好日子啊的家
堆和棧的區別: 一、堆疊空間分配區別: 1、棧(作業系統):由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧; 2、堆(作業系統)
8樓:瀛洲煙雨
堆拼音:duī
簡體部首:土解釋:
1.累積在一起的東西:~棧。~房。土~。
2.累積在一起,聚積在一起:~積。~放。~壘。~摞。~砌。
3.量詞,用於成堆的物或成群的人:一~人。
棧拼音:zhàn
簡體部首:木解釋:
1.儲存貨物或供旅客住宿的房屋:貨~。客~。~房。
2.竹木編成的遮蔽物或其他東西:馬~(養馬的竹木棚)。~車(古代用竹木編成棚的車子)。
3.用木料或其他材料架設的通道:~道。~橋(一種形似橋樑的建築物,用於裝卸貨物、上下旅客等)。
4.通過,越過:~山航海。
堆疊指的是堆還是棧,還是合體,堆和棧的區別是啥
一 預備知識 程式的記憶體分配 一個由c c 編譯的程式佔用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結...
C中堆和堆疊有什麼不一樣,C 堆和堆疊有什麼區別
一個由c c 編譯的程式佔用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...
什麼是棧和堆
堆和棧的區別 1 管理方式不同 堆是由程式設計師通過呼叫系統庫函式來管理記憶體,所以管理不力就會出現常說的記憶體洩漏。棧是由計算機系統分配記憶體而且系統有專門的暫存器儲存棧指標。2 生長方式不同。堆是向高地址擴充套件也就是常說的向上生長。是不連續的記憶體區域。棧是向低地址擴充套件也就是常說的向下生長...