與棧的結構相反,佇列的結構具有一種「先入先出」的特點,最主要的原因仍然在於,佇列只允許由一端插入元素而從另一端釋放元素。這就與現實生活中的佇列具有極其相似的特點,插入元素行為只在隊尾端實現(即通過移動隊尾指標可完成目的),而輸出元素在隊首端實現(移動隊首指標可完成目的)。
佇列一般具有兩種表示方法,包括順序佇列以及鏈佇列,先由鏈佇列開始,鏈佇列顧名思義,是由鍊錶表示的佇列,需要有兩個分別指示隊首與隊尾的指標 (頭指標與尾指標)。同時,需要設定乙個頭結點,初始化將頭指標與尾指標均指向頭結點,這也作為鏈佇列是否為空的判別依據。鏈佇列的基本結構**與示意圖如下,鏈佇列的單個節點用qnode進行表示,而頭指標與尾指標用新定義的結構體linkque來進行表示 佇列結構的**以及示意圖如下:
在明確了佇列的結構後,首先需要定義佇列的初始化操作,主要思路包括:1)新建乙個空佇列q,將佇列的隊首指標與隊尾指標初始化指向同乙個結點q(此處空佇列與新建結點重名,在佇列未插入新元素時兩者均只是乙個結點,換言之,是同乙個事物) 2)將q隊首指標所指結點(即隊首元素)的後繼元素指為空。具體**以及示意圖如下:
由於在佇列之中,插入節點的操作僅僅在隊尾進行,需要完成的步驟只有新建結點,以及處理新節點與尾指標尾結點的關係。 佇列的插入節點操作主要思路如下:1)新建乙個節點p,p的資料域用int型別的變數e來賦值 2)p的後繼結點賦值為null,同時將節點p作為尾指標tail所指的節點的後繼(tail指標初始化指向頭結點,這步操作意為將新節點p鏈結至頭結點後) 3)將tail指標賦值為指標p。 **以及示意圖如下所示:
刪除結點操作與插入節點操作相反,如果佇列不空,則刪除隊首的節點。主要思路如下:1)新建乙個指標p,將指標p指向q的隊首指標所指節點的後繼節點 2)重新定義隊首節點的後繼結點,將該後繼結點賦值為p的後繼節點 3)進行條件判斷,如果p指標與佇列的尾部指標指向同一段記憶體 ,將隊首指標與隊尾指標指向同一段記憶體,即隊列為空。4)釋放p指標所指的節點記憶體
在插入節點與刪除結點操作完成後,需要了解銷毀佇列的操作,銷毀佇列就是不停地出隊的重複。主要思路如下:1)通過while迴圈來控制佇列指標的移動以及釋放結點操作,當佇列q的head指標指向的結點不為空時,將tail指標指向head指標的後繼結點 2)釋放head指標所指的結點的記憶體空間 3)將head指標賦值為tail指標的值,即head指標繼續向後挪一位。具體**如下:
void destroy(linkque q)
}
資料結構 (環形佇列 基本操作函式)
環形佇列基本操作函式 進隊,出隊,輸出隊中元素 include include include define maxn 11 定義環行順序佇列的儲存長度 using namespace std typedef int elemtype typedef struct cseque void init ...
棧與佇列基本操作
想了下,上學期學的資料結構線性結構還有些混亂的地方,想做一點注意事項的總結。1.鍊錶 2.棧順序棧 定義乙個陣列 可以是陣列形式的data 或指標形式的 data,若是指標形式就 需要在結構體中加乙個變數maxsize存放陣列的最大容量 和棧頂指標 在順序棧中就是 陣列下標 棧頂指標存放棧頂元素,初...
棧與佇列基本操作
include include typedef struct lnodelnode,linklist 頭插法 linklist create list head int n return head 尾插法 linklist create list tail int n else tail next ...