棧的算法:
計算機內部空間是連續存儲的,但是可以通過邏輯上改變內存的物理結構,數據在內存上呈現出的是連續分佈狀態
主要的典型數據結構
在實現棧這種數據結構時,首先要定義一個數組和一個變量。數組中所包含的元素個數就是棧的大小(棧中最多能存放多少個數據)。
變量中則存儲着一個索引,指向存儲在棧中最頂端的數據,該變量被 稱爲“棧頂指針”。
棧的大小可以根據程序的需求任意指定。假設最多 也就有 100 個數據,那麼定義一個能把它們都存儲下來的棧就可以了, 這樣的話就可以定義一個元素數爲 100 的數組。這個數組就是棧的基礎。
接下來編寫兩個函數,一個函數用於把數據存入到棧中,也叫作壓入到棧中;另一個函數用於從棧中把數據取出來,也叫作從棧中彈出來。在這兩個函數中,都需要更新棧中所存儲的數據的總數,以及更 新棧頂指針的位置。也就是說通過使用由數組、棧頂指針以及入棧函 數和出棧函數所構成的集合,就能實現棧這種數據結構了
2.瞭解結構體的組成:
要想理解用 C 語言程序實現鏈表和二叉樹的方法,就必須先了解 何謂“結構體”。所謂結構體,就是把若干個數據項彙集到一處並賦予 其名字後所形成的一個整體。
例如,可以把學生的語文、數學、英語 的考試成績彙集起來,做成一個叫作 TestResult 的結構體。
在 struct 這個關鍵詞後面接上結構體的名字,然後在名字後面接上用“{”和“}”括起 來的程序塊,並在程序塊中列出若干個數據項。
一旦定義完結構體,就可以把結構體當作是一種數據類型,用它來定義變量。
如果把結構體 TestResult 用作數據類型並定義出了一個名 爲 xiaoming 的變量(代表小明的成績),那麼在內存上就相應地分配出了一塊空間,這塊空間由用於存儲 Chinese、Math、English 這三個成員 (Member)數據所需的空間彙集而來。被彙集到結構體中的每個數據項都被稱作“結構體的成員”。
在爲結構體的成員賦值或是讀取成員的值時,可以使用形如 xiaoming.Chinese(表示小明的語文成績)的表達式, 即以“.”分割變量和結構體的成員
如果要編寫一個用於處理 100 名學生考試成績的程序,就需要定 義一個以 TestResult 爲數據類型、包含 100 個元素的數組。通過定義, 在內存上就分配出了一塊空間,能夠存儲 100 個數據的集合,每個數據的集合中都含有 Chinese、Math、English 三個數據項。接下來只要巧妙地運用結構體的數組就可以實現鏈表和二叉樹了。
3.瞭解鏈表和二叉樹的實現方法:
下面講解如何使用結構體的數組實現鏈表。鏈表是一種類似數組 的數據結構,這個“數組”中的每個元素和另一個元素都好像是手拉着 手一樣。在現有的以結構體 TestResult 爲數據類型的數組 Student[100] 中,爲了讓各個元素“把手拉起來”,就需要在結構體中再添加一個成員
這裏的成員 Ptr 存儲了數組中另一個元素的地址。在 C 語言中,把存儲着地址的變 量稱爲“指針”。這裏的“*”(星號)就是指針的標誌。諸位可以看到, Ptr 就是以結構體 TestResult 的指針(struct TestResult*)爲數據類型的 成員。這種特殊的結構體可以稱爲“自我引用的結構體”。之所以叫這 個名字,是因爲在結構體 TestResult 的成員中,含有以 TestResult 的指 針爲數據類型的成員,這就相當於 TestResult 引用了與自身相同的數據 類型。
在結構體 TestResult(已變成了自我引用的結構體)的數組中,每 個元素都含有一個學生的語文、數學、英語成績以及成員 Ptr。Ptr 中存 儲着本元素接下來該與哪一個元素相連的信息,即下一個元素的地址。 在鏈表的初始狀態中,會按照元素在內存上的分佈情況設定成員 Ptr 的值
在二叉 樹的實現中,用的還是自我引用的結構體,只不過要改爲要帶有兩個 連接信息的成員的自我引用結構體
二叉樹多用於實現那些用於搜索數據的算法,比如“二分查找法”。 比起只使用鏈表,使用二叉樹能夠更快地找到數據。因爲搜索數據時 並不是像在簡單數組中那樣沿一條線搜索,而是尋着二叉樹不斷生長 出來的兩根樹杈中的某一枝搜索,這樣就能更快地找到目標數據了
因此數組對於算法和數據結構來說很重要,需要大家靈活使用