表、棧和隊列是最簡單和最基本的三種數據結構。基本上,每個有意義的程序都將明晰地至少使用一種這樣的數據結構,好比棧在程序中老是要間接地用到,無論你在程序中是否作了聲明。node
本章學習重點:算法
ADT數組
抽象數據類型(abstract data type)是一個操做的集合,是數學的抽象,在ADT中不涉及如何實現操做的集合,這能夠看做是模塊化設計的擴充。對於每種ADT並不存在什麼法則來告訴咱們必需要有哪些操做,這是一個設計決策、錯誤處理和關係重組,通常取決於程序設計者。服務器
表ADT網絡
表能夠用數組來實現,查找操做以線性時間執行,插入和刪除操做的最壞狀況爲O(N)。因爲插入和刪除的低效以及表的大小必須事先已知,因此簡單數組通常不用來實現表這種數據結構。爲了不插入和刪除的時間開銷,咱們須要容許表能夠不連續存儲,不然表的部分或所有須要總體移動。程序設計中經常留出一個稱之爲表頭(header)或啞結點(dummy node)的標誌結點,它解決了幾個棘手的問題:從表頭插入元素;刪除表頭元素;通常刪除問題,須要記住被刪除元素前面的表元。數據結構
三個用例:模塊化
棧ADT函數
棧是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫作棧的頂,只有棧頂元素是能夠訪問的。棧有時也稱LIFO(後進先出)表。同表同樣,棧既能夠用數組,也能夠用鏈表來實現。因爲CreateStack在棧的數組實現中須要一個初始化數組長度的參數,而在鏈表實現中不須要參數,所以後者的實現中不添加啞元的話,那麼這個使用棧的例程就須要知道正在使用的是哪一種方法。不幸的是,效率和軟件理想主義經常發生衝突。post
三個應用:學習
算法描述:作一個空棧,讀入字符直到文件尾。若是字符是一個開放符號,則將其推入棧中。若是字符是一個封閉符號,
則當棧空時報錯。不然,將棧元素彈出。若是彈出的符號不是對應的開放符號,則報錯。在文件尾,若是棧非空則報錯。
能夠看出,算法是線性的且是在線(on-line)的。
算法描述:當見到一個數時就把它推入棧中,遇到一個運算符時就做用於從該棧彈出的兩個數上,將所得結果推入棧中。
時間花費O(N).除此以外,咱們還能夠用棧將一個標準形式(也稱中綴式(infix))轉換成後綴式。
隊列ADT
像棧同樣,隊列也是表。然而,使用隊列時插入在一端進行而刪除則在另外一端進行。隊列能夠用數組實現也能夠用鏈表實現。
三個應用:
Summary
本章描述了一些ADT的概念,而且利用三種最多見的抽象數據類型(ADT)闡述了這個概念。主要目的就是將抽象數據類型的具體實現與它們的功能分開。程序必須知道操做都作些什麼,可是若是不知道如何去作實際上更好。
表、棧和隊列或許在所有計算機科學中是三個基本的數據結構,大量的例子證實了它們普遍的用途。特別地。咱們看到棧是如何用來記錄過程和函數調用的,已經遞歸其實是如何實現的。理解這些過程是很是重要的,其緣由不僅是由於它使得過程語言成爲可能,並且還由於知道遞歸的實現從而消除了圍繞其使用的大量謎團。雖然遞歸很是強大,可是它並非徹底隨意的操做;遞歸的誤用和亂用可能致使程序崩潰。