首先比較鍊錶和順序表的總體差異:
鍊錶是含有頭結點,且一般頭結點不儲存資料或只儲存長度等附加資訊。尾結點儲存資料且尾結點的指標域指向空。實現方法多為對已經定義的結構體指標進行動態分配並作為頭結點,之後再進行各類操作。
引用中的總結:
其實若有足夠多的結構體,無需動態分配也可以建立鍊錶,但這違背了動態擴充套件的初衷,另外,直接在全域性定義的結構體,儲存在靜態儲存區;在函式內定義的結構體,儲存在棧區;而使用malloc來申請空間的結構體,儲存在堆空間中。鍊錶一般都放在堆空間中。
靜態儲存區:內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料、全域性資料和常量。
棧區:在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
堆區:亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意大小的記憶體,程式設計師自己負責在適當的時候用free或delete釋放記憶體。動態記憶體的生存期可以由我們決定,如果我們不釋放記憶體,程式將在最後才釋放掉動態記憶體。 但是,良好的程式設計習慣是:如果某動態記憶體不再使用,需要將其釋放掉,否則,我們認為發生了記憶體洩漏現象。順序表含有頭結點與尾結點,且頭尾結點皆儲存資料。實現方法為對已經定義的結構體中的指標變數進行動態分配。
接下來我們分別了解下順序表和煉表中棧與佇列的異同。
1.順序棧
實現方法:其定義的結構體(設結構體名為s)中普遍包含base與top這兩個指標變數(base作為棧底,top作為棧頂),一般對s.base進行動態分配,而base儲存資料,top指向棧頂元素的下乙個空間,無資料。(這樣做方便通過判定top=base是否成立,來判斷是否空棧)
2.順序佇列
由於其先進先出的特點,不同於棧,佇列的順序實現其實是一種迴圈佇列。
實現方式:對結構體中(設名為q)的base指標進行動態分配,而隊頭front與隊尾rear,則以int形式來表示,即單純看作乙個記號來充當「指標」,而非真正的指標變數。此外,不同於棧可以通過top=base的判定來進行空棧判斷,順序佇列由於其迴圈的特性,滿棧時front=rear同樣成立。為了避免混淆,通常犧牲乙個空間來進行判定,即佇列q的最大儲存資料量為實際申請量-1(此處不考慮malloc可能額外申請的空間)
3.鏈棧
實現方法同煉表,但是其頭結點是有資料的。另外,鏈棧的指標next是從棧頂指向棧底的,這意味這在初始化函式中需要先定義棧頂作為"第乙個"結點。與邏輯上「先為棧底元素開空間」的想法不同。
4.鏈佇列
鏈佇列較為特殊,由於結構體q中只存在資料及表示結點之間關係的指標next,頭指標和尾指標需要在另乙個結構體內定義,即總共需要兩個結構體(或者也可以直接定義全域性變數)且頭結點無資料,尾結點有資料。
實現方法:對於頭指標和尾指標進行動態分配(一開始指向同一位址),q儲存資料和指標域。
總結:不同於順序表,順序棧和順序佇列都是頭結點有資料,尾結點無資料。而鏈佇列與鍊錶的頭尾結點特點基本一致,都是頭結點不存而尾結點存,但鏈佇列任一結點都儲存資料。
受限的線性表 棧 順序棧
include define maxsize 50 typedef int datatype using namespace std 棧的資料結構 順序棧 資料運算 1.初始化乙個空棧 初始指標 1 2.資料元素入棧 如果棧沒滿,資料元素入棧 3.資料元素出棧 如果棧沒空,資料元素出棧 4.得到棧頂...
線性表(二) 棧之順序棧
一 定義棧的基類 棧的基類 template class stack 判斷棧是否為空 virtual bool empty 0 棧中元素的大小 virtual size t size 0 獲取棧頂元素 virtual t top 0 彈出棧頂元素 virtual t pop 0 入棧 virtual...
線性表 List 棧的順序儲存
棧的定義 棧是一種特殊的線性表,棧只能在棧頂一段進行操作 先進後出 棧頂 top 允許操作的一端。棧底 bottom 不允許操作的一端。棧的常用操作 1 建立棧 2 銷毀棧 3 清空棧 4 入棧 5 出棧 6 獲取棧頂元素 7 獲取棧的大小 棧的順序儲存模型 我們可以重複利用之前寫過的線性表順序儲存...