線性表 鍊錶 棧 佇列的關係

2021-08-01 04:05:07 字數 1949 閱讀 5349

程式設計師在程式設計實戰操作面前有兩個攔路虎,第乙個是用遞迴的思想去解決問題,第二個是資料結構與演算法的應用。對於遞迴,由於其神奇的薄面紗總是然我們覺得難以理解,而大多數遞迴解法還是需要承擔一定的計算負擔的,因此我覺得能理解其思想與用法固然好,但是實在無法理解也只能慢慢適應。而對於第二個難題,資料結構與演算法基本上每乙個程式設計師都需要了解,因為,演算法是解答乙個問題的基本邏輯,如果你可以證明這個邏輯是正確的,那接下來的問題就是應該採用什麼樣的資料結構來保證你的程式能有最高的執行效率,即比較好的時間複雜性,同樣記憶體空間消耗也需要盡可能小。

作為了解資料結構與演算法的基礎,線性表通常是第乙個拿來作為介紹與研究的。但到底線性表的定義是什麼呢?很多資料上通常不是直接介紹線性表,而是直接介紹鍊錶、棧、佇列這幾個資料結構,那到底鍊錶、棧、佇列與線性表有沒有關係呢?或者說它們是什麼關係呢?

首先,什麼是線性表?就是一種連續或間斷儲存的陣列,這裡的連續和間斷是針對物理記憶體空間中線性表元素之間是否連續,其中連續陣列對應內建陣列的實現方式,間斷陣列對應的是指標的實現方式,這種方式也稱為鍊錶實現。

也就是說,線性表有兩種實現方式,一種是內建陣列實現,另一種是鍊錶實現,最好把鍊錶就理解為線性表的一種實現方式,而且從鍊錶的定義來看,它的本質是一種資料結構,其定義如下

struct listnode

;

而我們通常自定義的鍊錶中,一般使用typedef listnode* list; 這其實就是乙個listnode節點的next域,正是由於有next域的存在,所以我們通常會以一種邏輯結構理解的鍊錶(大多數資料結構教程中確實也是這麼表示的)。

首先,棧就是一種線性結構的表,也就是線性表,那麼也就是說它有兩種實現方式,一種是用內建陣列實現,一種是以鍊錶實現。

其次,棧有自己的結構特性:棧可以動態增長和縮減,即(一般)可以向乙個棧新增或從乙個棧刪除元素,但這種新增和刪除操作只能從棧的棧頂進行操作,這種限制也造就了棧的先進後出特性。

最後,注意上面只是說一般我們可以用內建陣列和鍊錶兩種方式來實現棧,但是,根據棧的特性,其實還可以用其他結構來實現棧,只要這種結構能實現棧的先進後出,而且只能從棧的棧頂進行插入和刪除操作,最常見的就是我們可以用兩個佇列來實現棧(當然,後面會解釋,其實佇列也是用陣列和鍊錶來實現的)。

比如,用內建陣列來實現棧,則可以這樣定義棧的結構:

struct stack_array

;

棧的鍊錶實現:

struct stack_list

;

如果採用鍊錶方式來實現棧,則一般需要有乙個表頭,因為棧需要在表頭位置來進行插入和刪除操作。

首先,佇列也是一種線性表(線性的資料結構),則佇列也可以用陣列和鍊錶兩種方式來實現;

其次,佇列也有自己的結構特性:佇列是先進先出的線性表,它同時維護表的兩端,但只能在表尾進行插入,在表頭進行刪除操作(這是有佇列的先進先出特性決定的)。

所以,不管是用陣列還是用鍊錶實現佇列,都需要遵循佇列的先進先出特性。

用內建陣列實現佇列,則佇列結構定義為:

struct queue_array

;

用鍊錶實現佇列,則佇列結構定義為:

struct node

;struct queue_list

;

不管是佇列的陣列還是鍊錶實現,在進行刪除和插入操作之後都需要維護佇列頭和尾的指向性元素(即front和real),以及佇列當前元素個數size。

線性表 棧 佇列

輔助定義 define maxsize 5 define ok 0 define error 1 typedef int selemtype typedef int status 棧 順序 鏈式 相關結構體定義 順序棧 typedef struct sqstack 順序棧共享空間 typedef s...

線性表 棧,佇列

1.3 棧 棧是一種先進後出的資料結構。只能在一端進行插入和刪除操作的特殊線性表。將資料進入棧稱為壓棧,資料出去稱為彈棧。壓棧 public void push t t 彈棧 public t pop 讓首結點指向第乙個結點的下乙個結點 head.next oldfirst.next 元素個數 1 ...

線性表 棧和佇列

線性表是n個元素的有限序列。表示方法有兩種,一種是順序表示,一種是鏈式表示。順序表示即採用一組位址連續的儲存單元依次儲存線性表的資料元素,通常採用陣列來實現 鏈式表示是用一組任意的儲存單元儲存線性表的資料元素,每一結點包含兩個域 資料域和指標域,資料域儲存資料,指標域儲存後繼儲存位址資訊,實現為 i...