回顧前一篇:數組
數據結構的做用是按照必定的規則管理和操做數據,有利於程序的編寫。數據結構
順序表最簡單的能夠用數組來實現。能夠動態地靜態地定義一張順序表,而數組是以靜態定義的。靜態定義所分配的內存空間是在棧上的,固定且連續的,不可改動。動態定義所分配的空間是在堆上的,可操做的。固然也是連續的,能夠進行擴展(不能縮小吧?),使用完畢後需手動釋放,系統不會自動回收,與靜態不一樣。指針
生成一張順序表→插入元素→刪除元素→系統自動回收/手動釋放隊列
對鏈表的操做和順序表含義是一致的。靜態鏈表的話相似於數組,結點都由程序定義好了,不是臨時開闢的,因此鏈表通常都是動態的。內存
建立一個鏈表→插入節點→刪除節點→銷燬鏈表。鏈表使用完後建議銷燬它,佔內存,動態須要手動釋放。方法是:順着鏈表,同時釋放結點,將表頭指針移至表尾,將表頭*list的內容置爲NULL,這樣鏈表list就空了,防止list變爲野指針。基礎
下面談談「棧」和「隊列」擴展
棧:「棧」是線性表的一種具體形式,其功能是「先進後出」(LIFO).對棧的操做只能在表尾操做,表尾稱爲:棧定(top),表頭稱爲:棧底(base/bottom)。棧像個子彈膛,最早進的子彈必定最後彈出。通常棧是以順序表爲基礎的,因此通常都是順序棧。循環
最開始棧中不含任何數據,叫作空棧,此時棧頂就是棧底。建立一個空棧,首先必須開闢一段連續的空間,此時棧頂與棧底相同。往棧中存放數據,叫作入棧操做,又稱壓棧。每壓入一個數據,top指針自增1.若是棧滿了,可追加空間。出棧即top指針減1,再取出指針指向的內容。直到top指針與base指針相同。清空一個棧,將base指針賦值給top指針,代表棧已空。銷燬一個棧則不一樣,首先要釋放掉內存空間,而後top和base指針置NULL,設置棧的最大容量爲0,計算當前棧的容量只需對top減去base便可。注意:內存空間和當前容量不是一個概念。程序
隊列:「隊列」一樣須要順序表或鏈表爲基礎,也就是說能夠用鏈表或順序表來構造一個隊列。與棧不一樣,其功能是先進先出(LIFO)。它要求數據從隊尾(rear)進,從對頭(front)出。下面介紹鏈隊列的操做。建立一個隊列,首先要在內存中建立一個頭結點,不存放數據,只是爲了方便操做而添加的。固然也能夠不定義。而後將隊列的頭指針和尾指針都指向這個頭結點。此時爲一個空隊列。隊列的其餘操做含義和棧一致,主要是對結點的指針進行操做,關鍵是先進先出(LIFO)。銷燬隊列和銷燬鏈表方法相似。方法
還有一種用順序表實現的隊列叫作循環隊列,其空間能夠循環使用。循環隊列通常有固定的容量,一樣要求先進先出。其邏輯上是循環的,物理上是線性的。整個循環隊列邏輯上就是一個緩衝區。循環隊列的實現有點像棧,只是當rear指針超出了隊列的地址範圍時,進行取模運算,使其從新指向0號單元。