數據結構與算法基本

棧的算法:

計算機內部空間是連續存儲的,但是可以通過邏輯上改變內存的物理結構,數據在內存上呈現出的是連續分佈狀態

主要的典型數據結構

在實現棧這種數據結構時,首先要定義一個數組和一個變量。數組中所包含的元素個數就是棧的大小(棧中最多能存放多少個數據)。

變量中則存儲着一個索引,指向存儲在棧中最頂端的數據,該變量被 稱爲“棧頂指針”。

棧的大小可以根據程序的需求任意指定。假設最多 也就有 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 的值

在二叉 樹的實現中,用的還是自我引用的結構體,只不過要改爲要帶有兩個 連接信息的成員的自我引用結構體

二叉樹多用於實現那些用於搜索數據的算法,比如“二分查找法”。 比起只使用鏈表,使用二叉樹能夠更快地找到數據。因爲搜索數據時 並不是像在簡單數組中那樣沿一條線搜索,而是尋着二叉樹不斷生長 出來的兩根樹杈中的某一枝搜索,這樣就能更快地找到目標數據了

因此數組對於算法和數據結構來說很重要,需要大家靈活使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章