《數據結構與算法分析:C語言描述_原書第二版》CH3表、棧和隊列_reading notes

表、棧和隊列是最簡單和最基本的三種數據結構。基本上,每個有意義的程序都將明晰地至少使用一種這樣的數據結構,好比棧在程序中老是要間接地用到,無論你在程序中是否作了聲明。node

本章學習重點:算法

  • 理解抽象數據類型(ADT)的概念學習如何對錶進行有效的操做
  • 熟悉棧ADT及其在實現遞歸方面的應用
  • 熟悉隊列ADT及其在操做系統和算法設計中的應用

ADT數組

抽象數據類型(abstract data type)是一個操做的集合,是數學的抽象,在ADT中不涉及如何實現操做的集合,這能夠看做是模塊化設計的擴充。對於每種ADT並不存在什麼法則來告訴咱們必需要有哪些操做,這是一個設計決策、錯誤處理和關係重組,通常取決於程序設計者。服務器

表ADT網絡

表能夠用數組來實現,查找操做以線性時間執行,插入和刪除操做的最壞狀況爲O(N)。因爲插入和刪除的低效以及表的大小必須事先已知,因此簡單數組通常不用來實現表這種數據結構。爲了不插入和刪除的時間開銷,咱們須要容許表能夠不連續存儲,不然表的部分或所有須要總體移動。程序設計中經常留出一個稱之爲表頭(header)或啞結點(dummy node)的標誌結點,它解決了幾個棘手的問題:從表頭插入元素;刪除表頭元素;通常刪除問題,須要記住被刪除元素前面的表元。數據結構

三個用例:模塊化

  • 計算一元多項式,對於大部分項都有的稠密多項式能夠用數組來實現,反之其運行時間不被接受,這時候能夠用鏈表快速實現之。
  • 實現基數排序。
  • 多重表。多名學生隨機選多門課(40000名學生和2500門課)用多表實現比二維數組實現高效得多。

棧ADT函數

棧是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫作棧的頂,只有棧頂元素是能夠訪問的。棧有時也稱LIFO(後進先出)表。同表同樣,棧既能夠用數組,也能夠用鏈表來實現。因爲CreateStack在棧的數組實現中須要一個初始化數組長度的參數,而在鏈表實現中不須要參數,所以後者的實現中不添加啞元的話,那麼這個使用棧的例程就須要知道正在使用的是哪一種方法。不幸的是,效率和軟件理想主義經常發生衝突。post

三個應用:學習

  • 平衡符號,能夠用於編譯器檢查程序的語法錯誤。  

       算法描述:作一個空棧,讀入字符直到文件尾。若是字符是一個開放符號,則將其推入棧中。若是字符是一個封閉符號,

    則當棧空時報錯。不然,將棧元素彈出。若是彈出的符號不是對應的開放符號,則報錯。在文件尾,若是棧非空則報錯。

    能夠看出,算法是線性的且是在線(on-line)的。  

  • 後綴表達式。如操做4.99 * 1.06 + 5.99 + 6.99 * 1.06採用後綴(postfix)或逆波蘭(reverse Polish)記法:4.99 1.06 * 5.99 + 6.99 1.06 * +  

      算法描述:當見到一個數時就把它推入棧中,遇到一個運算符時就做用於從該棧彈出的兩個數上,將所得結果推入棧中。

    時間花費O(N).除此以外,咱們還能夠用棧將一個標準形式(也稱中綴式(infix))轉換成後綴式。  

  • 函數調用。很少說了,CSAPP比這裏詳細得多。

隊列ADT

像棧同樣,隊列也是表。然而,使用隊列時插入在一端進行而刪除則在另外一端進行。隊列能夠用數組實現也能夠用鏈表實現。 

三個應用:

  • 看成業送交給一臺行式打印機,它們就按照到達的順序被排列起來。所以,被送往行式打印機的做業基本上是放在一個隊列中。這個例子是關於計算機網絡的。用許多中PC機的網絡設置,其中磁盤是放在一臺叫作文件服務器的機器上的。使用其餘計算機的用戶是按照先到先使用的原則訪問文件的,所以其數據結構是一個隊列。進一步的例子:
  • 當全部的接線員忙的不可開交的時候,對大公司的傳呼通常都被放在一個隊列中。             
  • 在大規模的大學裏,若是全部的終端都被佔用,因爲資源有限,學生們必須在一個等待表上簽字。在終端上呆的時間最長的學生將首先被強制離開,而等待時間最長的學生則將是下一個被容許使用終端的用戶。正如棧同樣,隊列還有其餘豐富的用途,這樣一種簡單的數據結構居然可以如此重要,實在使人驚奇。

Summary

本章描述了一些ADT的概念,而且利用三種最多見的抽象數據類型(ADT)闡述了這個概念。主要目的就是將抽象數據類型的具體實現與它們的功能分開。程序必須知道操做都作些什麼,可是若是不知道如何去作實際上更好。  

表、棧和隊列或許在所有計算機科學中是三個基本的數據結構,大量的例子證實了它們普遍的用途。特別地。咱們看到棧是如何用來記錄過程和函數調用的,已經遞歸其實是如何實現的。理解這些過程是很是重要的,其緣由不僅是由於它使得過程語言成爲可能,並且還由於知道遞歸的實現從而消除了圍繞其使用的大量謎團。雖然遞歸很是強大,可是它並非徹底隨意的操做;遞歸的誤用和亂用可能致使程序崩潰。

相關文章
相關標籤/搜索