c/c++記憶體分為五個部分:
1、棧區(stack):存放函式的引數值,區域性變數的值等(編譯器自動分配釋放 )。
2、堆區(heap): 注意:與資料結構中的堆完全不同,分配方式類似於鍊錶(程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os** )。
3、全域性區(靜態區):全域性變數和靜態變數儲存在一塊,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域(程式結束後由系統釋放)。
4、文字常量區:常量字串就是儲存在這裡(程式結束後由系統釋放)。
5、程式**區:存放函式體的二進位制**。
在unix環境高階程式設計一書中,對於棧和堆是這樣定義的:
棧:自動變數以及每次函式呼叫是所需儲存的資訊都存放在此段中。每次呼叫函式時,其返回位址以及呼叫者的環境資訊(例如某些機器暫存器的值)都存放在棧中。然後,最近被呼叫的函式在棧上為其自動和臨時變數分配儲存空間。通過以這種方式使用棧,可以遞迴呼叫c函式。遞迴函式每次呼叫自身時,就使用乙個新的棧幀,因此乙個函式呼叫例項中的變數集不會影響另乙個函式呼叫例項中的變數。
堆:通常在堆中進行動態儲存分配,由於歷史上形成的慣例,堆位於非初始化資料段和棧之間。
棧和佇列標頭檔案:
#include
#include
棧:
stackcurstack; //棧定義
操作:
curstack.empty() 如果棧為空返回true,否則返回false;
curstack.size() 返回棧內元素的大小;
curstack.pop() 從棧頂彈出乙個成員;
curstack.push() 向棧內壓入乙個成員;
curstack.top() 返回棧頂,但不刪除成員;
佇列:
queuecurqueue; //佇列定義
操作:
curqueue.empty() 如果隊列為空返回true,否則返回false;
curqueue.size() 返回佇列內元素的大小;
curqueue.pop() 從佇列彈出乙個成員;
curqueue.push() 向佇列壓入乙個成員;
curqueue.front() 返回到隊首,但不刪除成員;
curqueue.back() 返回到隊尾,但不刪除成員;
堆、棧、佇列之間的區別是?
①堆是在程式執行時,而不是在程式編譯時,申請某個大小的記憶體空間。即動態分配記憶體,對其訪問和對一般記憶體的訪問沒有區別。
②棧就是乙個桶,後放進去的先拿出來,它下面本來有的東西要等它出來之後才能出來。(後進先出)
③佇列只能在隊頭做刪除操作,在隊尾做插入操作.而棧只能在棧頂做插入和刪除操作。(先進先出
C 中的堆疊和佇列
c stl中需要的標頭檔案 include 定義方式 stack 元素屬性 變數名 函式 top 返回棧頂 push 入棧,在棧頂新增元素 pop 出棧,移除棧頂元素 size 返回棧內元素的個數 empty 堆疊為空返回真 c stl中需要的標頭檔案 include 定義方式 queue 元素屬性...
堆疊,佇列,優先佇列
包含標頭檔案 include定義 stacks 特點 先進後出。即 像瓶子一樣。先進來的資料在底部。例 輸入 1 2 3 4 5 輸出 5 4 3 2 1 棧的基本操作 s.push a 把元素a入棧。s.pop 刪除棧頂元素。s.top 返回棧頂元素,但不會刪除。s.size 返回棧中元素個數。s...
佇列 堆 棧 堆疊的區別?
佇列是先進先出 就像一條路,有乙個入口和乙個出口,先進去的就可以先出去。而棧就像乙個箱子,後放的在上邊,所以後進先出。程序中每個執行緒都有自己的堆疊,這是一段執行緒建立時保留下的位址區域。我們的 棧記憶體 即在此。至於 堆 記憶體,我個人認為在未用new定義時,堆應該就是未 保留 未 提交 的自由空...