数据结构与算法基本
棧的算法:
計算機內部空間是連續存儲的,但是可以通過邏輯上改變內存的物理結構,數據在內存上呈現出的是連續分布狀態
主要的典型數據結構
在實現棧這種數據結構時,首先要定義一個數組和一個變量。數組中所包含的元素個數就是棧的大小(棧中最多能存放多少個數據)。
變量中則存儲著一個索引,指向存儲在棧中最頂端的數據,該變量被 稱為“棧頂指針”。
棧的大小可以根據程序的需求任意指定。假設最多 也就有 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 的值
在二叉 樹的實現中,用的還是自我引用的結構體,只不過要改為要帶有兩個 連接信息的成員的自我引用結構體
二叉樹多用于實現那些用于搜索數據的算法,比如“二分查找法”。 比起只使用鏈表,使用二叉樹能夠更快地找到數據。因為搜索數據時 并不是像在簡單數組中那樣沿一條線搜索,而是尋著二叉樹不斷生長 出來的兩根樹杈中的某一枝搜索,這樣就能更快地找到目標數據了
因此數組對于算法和數據結構來說很重要,需要大家靈活使用
總結
- 上一篇: 最大值减最小值等于区间长度_呆哥数学每日
- 下一篇: cubemx串口的发送与接收_串口收发模