在面試的時候我們經常被問到堆和棧相關的問題,悲催的是還傻傻分不清面試官要問的是哪個堆疊。
是的,堆和棧有兩層含義,分別對應如下兩個方面:
1. 堆
官方定義如下:n個元素的序列,當且僅當滿足以下關係時稱之為堆:
堆其實就是利用完全二叉樹的結構來維護的一維陣列
如果所有的子節點都小於其父節點,這樣的堆稱為大頂堆;相反稱為小頂堆
堆資料結構的介紹就這麼些了,那它有啥用呢?我們發現如果一直取根節點,得到的序列就是乙個有序序列,感覺這樣的資料結構天生就是為排序準備的呀。
2. 棧
棧是一種先進後出的資料結構,官方定義為:限定僅在表尾進行插入或刪除操作的線性表,表尾稱為棧頂,表頭為棧底。
說白了,棧在資料結構裡邊可以看成是一端封死了的容器。就像公尺缸一樣的,先倒進去的公尺最後才能倒出來。
別看這麼簡單的乙個資料結構,其用途可不可小覷,從普通**開發到編譯器再到核心都有其身影,最常見如編譯器中的括號匹配,核心中的程式現場儲存等。、
3. 佇列
佇列跟棧有點類似,只是它是乙個先進先出的資料結構。只執行在表的一端插入,另一端刪除,插入的一方叫隊尾,刪除的一方叫隊頭。
好吧,也是個簡單的資料結構,簡單到都不好意思介紹下去了,用途的話也是大大的廣,比如快取設計,訊息佇列等等。
在作業系統中的堆疊是乙個特殊的儲存區,棧一般是由作業系統控制分配**,用在如區域性變數,函式呼叫儲存等地方,其大小是固定的(比如有些系統為2m),所以如果要求分配的空間大於了棧的大小,將出現棧溢位。
堆是由使用者(碼農)控制分配和**,此處的控制是指顯式呼叫乙個系統函式,如malloc,free等,從系統中分配乙個所需大小的空間出來。其在系統中的儲存方式依據系統的不同而不同,在linux系統中,堆可以理解成乙個鍊錶陣列,該鍊錶陣列中存放的是記憶體空間位址,如下這樣的設計:
當需要分配時,系統將從對應大小的列表中摘乙個下來分給使用者,如果分配空間過多,會將多餘的空間掛接到對應的列表下。
資料結構與作業系統中的的堆疊對比
在分配的時候,有多種策略。首先查詢是否有空閒的並且滿足大小的堆記憶體,然後把最大的那塊給需求者。這裡有點像資料結構中堆的優先權。作業系統中堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,...
資料結構中的堆疊和記憶體中的堆疊
記憶體常用的區域分類 棧區 stack 堆區 heap 全域性區 static區 文字常量區 程式 區。棧區 由編譯器自動分配和釋放,遵循 後進先出 的規則。在函式呼叫時,第乙個進棧的是主函式中的下一條指令位址,然後是函式的各個引數 大多數c編譯器中,引數從右往左入棧 然後是函式的區域性變數。靜態變...
作業系統方面的堆 棧和資料結構方面的堆 棧
堆疊 在計算機領域,堆疊是乙個不容忽視的概念,但是很多人甚至是計算機專業的人也沒有明確堆疊其實是兩種資料結構。要點 堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引...