C語言數據結構——第三章 棧和隊列

3、棧和隊列

  棧和隊列是兩種重要的線性結構。從數據結構的角度來看,棧和隊列也是線性表,它的特殊性在於棧和隊列的基本操做是線性表操做的子集,它們的操做相對於線性表來講是受到限制的,所以,能夠稱其爲限定性的數據結構算法

  從數據類型的角度看,它們是和線性表大不相同的兩種重要的抽象數據類型,在面向對象的程序設計中,它們是多型數據類型數據結構

   3.1-棧

    3.1.1-抽象數據類型棧的定義

      是限定僅在表尾進行插入或刪除操做的線性表,又能夠稱爲後進先出的線性表。 函數

      棧頂棧的表尾端spa

      棧底棧的表頭端設計

      空棧不含元素的空表指針

    3.1.2-棧的表示和實現

      和線性表類似,棧也有兩種存儲表示方法,即順序棧和鏈棧對象

      (1)棧的順序存儲遞歸

        所謂棧的順序存儲,就是採用一組物理上連續的存儲單元來存放棧中全部元素,並使用top指針來指示當前棧中處於棧頂的元素隊列

      (1.1) 順序棧的基本操做:數學

        -1:初始化棧函數的實現

        • 對棧空間進行初始化
        • 對棧頂指針進行初始化

        -2:判斷棧是否爲空的函數實現

        • 將當前棧頂指針的值與以前初始化的設置的棧頂指針的值相比較
        • 若二者相等,則表示當前棧爲空,不然表示當前棧不爲空

        -3:進棧函數的實現

        • 判斷當前棧是否有剩餘空間
        • 若當前棧未滿,修改棧頂指針的值,使其指向棧的下一個空閒位置
        • 將要進棧的元素放在上述空閒位置,進棧操做完成
        • 若棧滿則表示沒有空間,沒法進行棧操做

        -4:出棧函數的實現

        • 判斷棧是否爲空,若爲空則沒法進行出棧操做,給出棧爲空的提示
        • 若棧不爲空,則記下當前棧頂指針的值
        • 修改棧頂指針的值,使其指向出棧元素的下一個元素
        • 返回第二步中記下的棧頂指針的值對應棧中的元素

        -5:獲取棧頂元素函數的實現

        • 判斷當前棧是否爲空
        • 若當前棧爲空,則沒法獲取任何棧頂元素,詞是給出棧爲空的提示,並結束操做
        • 若不爲空,則返回棧頂元素

        -6:遍歷棧內元素函數的實現

        • 判斷棧是否爲空,若爲空,則棧內沒有元素能夠訪問,此時給出棧爲空的提示
        • 若棧不爲空,則從棧底到棧頂依次訪問棧中元素

        -7:經過用戶輸入數據的方式建立一個順序棧

        • 接收用戶輸入
        • 若用戶輸入的是空,則算法結束,不然執行下一步
        • 將用戶輸入的元素進棧

      (2)棧的鏈式存儲

      棧的順序存儲一般要求系統分配一組連續的存儲單元,在實現時,對於某些語言而言,當棧滿後想要增長連續的存儲空間時沒法實現的。咱們能夠經過鏈式存儲來實現須要多少存儲空間就申請多少存儲空間,這減低空間使用的浪費率。

      (2.1)鏈棧的基本操做

        -1:初始換鏈棧函數的實現

        • 建立一個鏈棧結點
        • 使用該結點對棧頂指針進行初始化

        -2:判斷鏈棧是否爲空函數的實現

        • 判斷指示棧頂的結點的指針域是否爲空
        • 若上一步爲真,則表示當前棧爲空,不然表示當前棧不爲空

         -3:進棧函數的實現

        • 建立一個新的結點,並將待進棧的元素存入該結點的數據域中
        • 將新的結點的指針域指向棧頂結點指針與指向的結點
        • 將棧頂結點的指針域指向新的結點

        -4:出棧函數的實現

        • 判斷棧是否爲空
        • 若第一步爲真,則沒法執行元素出棧操做,此時給出棧爲空的提示,不然執行
        • 記下此時的棧頂結點指針域指向的結點
        • 修改棧頂結點的指針域,在其中存入第三步記下的結點指針域的值
        • 將data域值爲da的結點出棧

        -5:獲取棧頂元素函數的實現

        • 判斷棧是否爲空
        • 若第一步爲真,則執行第三步,不然執行第四步
        • 給出棧爲空的提示並返回
        • 返回棧頂元素的值

        -6:經過用戶輸入的方式創一個鏈棧

        • 接收用戶輸入
        • 若第一步未結束標誌,則算法結束,不然執行下一步
        • 將用戶輸入的元素進棧

  3.2-隊列

    與棧同樣,隊列也是一種特殊的線性表,不一樣的是,隊列在進行數據操做是必須遵循「先進先出」的原則,這一特色決定了隊列的進本操做須要在其兩端進行

    3.2.1-隊列的基本概念

      隊列的基本操做一般在隊列兩端被執行,其中執行插入元素操做的一端被稱爲隊尾;執行刪除元素操做的一段被稱爲隊頭。隊列中的元素個數就是隊列的長度,若隊列中不包含任何元素,則被稱爲隊空,若隊列中沒有可用空間存儲待進隊元素,此時咱們稱爲隊滿

    3.2.2-隊列的順序存儲

      隊列的順序存儲是指採用一組物理上連續的存儲單元來放隊列中的全部元素。爲了便於計算隊列中的元素個數,咱們約定,隊頭指針指向實際隊頭元素所在位置的前一位置,對位指針指向實際隊尾元素所在的位置。

    3.2.3-順序隊列的基本操做

      (1)初始化隊列函數的實現

        • 對隊列空間進行初始化
        • 對隊頭指針進行初始化
        • 對隊尾指針進行初始化

      (2)判斷隊列是否爲空函數的實現

        • 將隊頭指針的值與隊尾指針的值相比較
        • 若二者相等則表示當前隊列爲空,不然表示當前隊列不爲空

      (3)元素進隊函數的實現

        • 判斷當前隊列是否有剩餘空間
        • 若當前隊列未滿,修改隊尾指針的值,使其指向隊列的下一個空閒位置
        • 將要進對的元素放在上述空閒位置,進隊操做完成
        • 若隊滿,則表示沒有空間用於執行進隊操做

      (4)元素出隊函數的實現

        • 判斷隊列是否爲空,若隊空則沒法執行出隊操做,並提示隊列爲空
        • 若隊列不爲空,則修改隊頭指針的值,使其指向待出隊元素
        • 返回待出隊元素 

      (5)獲取隊頭元素的實現

        • 判斷當前隊列是否爲空
        • 若第一步爲真,則沒法獲取任何隊頭元素,此時給出隊列爲空的提示,並結束操做,不然執行下一步
        • 返回當前隊頭元素

      (6)經過用戶輸入數據的方式建立一個順序隊列

        • 接收用戶輸入
        • 若第一步爲結束標誌,則算法結束;不然執行下一步
        • 將用戶輸入的元素進隊

    3.2.4-循環順序隊列的基本操做

      (1)元素進隊函數的實現

      • 判斷當前隊列是否有剩餘空間
      • 若當前隊列未滿,則修改隊尾指針的值,使其指向隊列的下一個空閒位置
      • 將要進隊的元素放在上述空閒位置,進隊操做完成
      • 若隊滿,則表示沒有空閒用於執行進隊操做

      (2)元素出隊函數的實現

      • 判斷隊列是否爲空
      • 若第一步爲真,則沒法執行出隊操做,提示隊列爲空並返回,不然執行下一步
      • 修改隊頭指針的值使其指向待出隊元素
      • 返回待出隊元素

      (3)經過用戶輸入的方式建立一個循環順序隊列

      • 接收用戶輸入
      • 若第一步爲結束標誌,則算法結束,不然執行下一步
      • 將用戶輸入的數據元素進隊

    3.2.5-隊列的鏈式存儲

      1.鏈式存儲的基本操做

        (1)建立鏈式隊列函數的實現

        • 建立一個新的結點
        • 初始化隊頭指針使其指向新結點
        • 初始化隊尾指針使其指向新結點

        (2)判斷隊頭指針和隊尾指針是否爲空函數的實現

        • 判斷隊頭和隊尾指針是否相等
        • 若相等則表示當前隊列爲空,不然表示當前隊列不爲空

        (3)進隊函數的實現

        • 建立一個新的結點,並將待進隊的元素存入該結點的數據域中
        • 將結點的地址存入隊尾指針指向的結點的指針域中
        • 將隊尾指針指向新結點

        (4)出對函數的實現

        • 判斷隊列是否爲空,若隊列爲空,則沒法執行出隊操做,此時給出隊列爲空的提示,不然執行下一步
        • 雞下隊頭指針指向的結點的下一個結點
        • 修改隊頭指針指向的結點的指針域,在其中存入第二步中記下結點的指針域的值
        • 判斷隊尾指針所在結點是否相等域第二部中記下的結點
        • 若第四步爲真,則修改隊尾指針,將其指向隊頭指針指向的結點
        • 返回出對元素

        (5)獲取隊頭元素函數的實現

        • 判斷隊列是否爲空
        • 若第一步爲真,則沒法獲取隊頭元素,提示隊列爲空,並結束操做;不然執行下一步
        • 返回隊頭元素的值

        (6)經過用戶輸入數據的方式建立一個隊列

        • 接收用戶的輸入
        • 若第一步爲結束標誌,則算法結束,不然執行下一步
        • 將用戶輸入的數據元素進隊。

      2.循環鏈式隊列

        循環鏈式隊列是將鏈式隊列的隊尾指針所在的結點指向頭結點。因爲頭結點的下一個結點就是隊頭元素所在獲得位置,而隊尾指針所在的結點又指向頭結點,因此由隊尾指針也能夠找到隊頭元素,所以在循環鏈式隊列中咱們不須要再增設隊頭指針。

  3.3-遞歸

    3.3.1-什麼是遞歸

      遞歸是數學中一個十分重要的概念,它也被大量應用在計算技術中,其特徵爲直接或間接調用自身,咱們一般把一函數調用自身稱爲遞歸不然稱爲間接遞歸。在算法設計中,任何間接遞歸均可以轉化爲直接遞歸來實現

相關文章
相關標籤/搜索