在看的二級C++的一本書中關於資料結構的內容列為了一章,介紹了比較新的概念。其中包括:線性表、棧、隊列、樹、二叉樹。
資料結構:是指相互之間存在一種或多種特定關係的的資料元素的集合。需要注意的是這裡的資料結構指的是邏輯結構,既關係,而非儲存結構。所謂的結構其實就是資料元素存在的前後關係,因此在實際儲存中各元素必須包括與前後元素的關係資訊。
根據資料結構中各資料元素之間的關係的複雜程度分為:線性結構和非線性結構。線性結構中的只有一個根節點,並且每個節點最多隻有一個前件和一個後件。簡單的說就是每一個節點都最多隻與兩個幾點有關係。那麼資料結構中除了線性結構就是非線性結構。如所示:
為了更好的理解線性表、棧、隊列、樹、二叉樹等的層次關係,請先看,然後先對線性部分作總結。
線性資料結構
線性表概念:線性表是資料結構中最簡單、最重要的一種結構。資料元素線上性表中的位置只取決於他們自己的序號,即邏輯上或者說相對位置上是線性。需要特別注意的是線性表是以順序儲存結構儲存的,即按照邏輯上的線性關心來順序分配儲存空間。
線性表運算:由於按照順序儲存結構儲存。因此在插入運算時,插入位置以後的元素需要後移一個空間。刪除時也需要刪除元素以後的全部元素都前移一個空間。
棧:棧是線性表的一種特殊的線性表,所以它也以順序儲存結構儲存。而它的特殊是由於它的運算限定在表的一端進行操作,而另一端是封閉。即先進後出,後進先出。
棧的運算:入棧運算時棧頂指標top加1然後再將新元素插入指標的位置。若指標當前已經指向儲存空間的最後一個位置則不能進行入棧操作,即上溢錯誤。退棧時和入棧操作相反,同時若指標為0時,即下溢錯誤。這個和SQL中的查詢有一點點類似。
隊列的概念:隊列也是一種特殊的線性表,它限制在一端插入操作,為隊尾。另一端進行刪除操作,為對頭。即先進先出,後進後出。這裡需要注意隊列是以迴圈結構的方式儲存的。
隊列的運算:入隊運算先將隊尾指標rear進一,即指向一個空的儲存空間,然後插入新元素。退隊時,對頭指標進一,即指向要刪除的元素的後一個元素。然後將元素刪除。同時,因為是迴圈儲存,所以當隊頭指標和隊尾指標重合時,則產生上溢或者下溢錯誤。
線性單鏈表:線性鏈表和線性表的主要區別在於,不再以順序結構的方式儲存,而是在每個元素分為兩個部分,一部分存資料,一部分與之相關的元素的指標。單鏈表的指標只指向下一個資料。
線性鏈表的運算:插入或刪除運算時,在插入位置插入新元素時,相鄰的元素所儲存的針需要變化。而其他無關的元素不需要變化。
雙線性鏈表:它的指標一個指向上一個資料,一個指向下一個資料。
雙向鏈表的運算:它的運算和單向鏈表操作上一致,只是插入和刪除時需要修改的指標不一樣。
迴圈鏈表放下一篇部落格非線性一起講了,太長了。下一篇再說!