資料結構 棧和佇列(c語言)

2021-10-08 07:54:02 字數 3104 閱讀 7472

棧和佇列是兩種重要的線性結構。從資料結構角度來看,棧和佇列也是線性表,其特殊性在於棧和佇列的基本操作是線性表操作的子集,他們是操作受限制的線性表,因此,可稱為限定性的資料結構。但從資料型別角度看,它們是和線性表大不相同的兩類重要的抽象資料型別。由於它們廣泛應用在各種軟體系統中,因此在物件導向的程式設計中,它們是多型資料型別。

棧是限定僅在表尾進行插入或者刪除操作的線性表。因此,對棧來說,表尾端有特殊含義,稱為棧頂,相應的,表頭稱為棧底。不含元素的空表稱為空棧。

棧的修改時按後進先出的原則進行的,因此,棧又稱為後進先出的線性表。棧的基本操作除了棧頂進行插入或者刪除外,還有棧的初始化、判空、以及取棧頂元素等。

和線性表類似,棧也有兩種儲存表示方法。

順序棧,即棧的順序儲存結構是利用一組位址連續的儲存單元依次放自棧底到棧頂的資料元素,同時設指標top指示棧頂元素在順序棧中的位置。另一方面,由於棧在使用過程中所需最大空間的大小是很難估計,因此,一般來說,在初始化設空棧時不應限定棧的最大容量,然後再應用過程中,當棧的空間不夠使用時再逐段擴大。因此,可以設定兩個常量:stack_init_size(儲存空間初始化分配量)和stackincrement(儲存空間分配增量)。

typedef structsqstack
其中,stacksize指示棧的當前可用最大容量。棧的初始化操作為:按設定的初始化分配量進行第一次儲存分配,base可稱為棧底指標,在順序棧中,它始終指向棧底的位置,若base的值為null,則表明棧結構不存在。稱top為棧頂指標,其初值指向棧底,即top=base可作為棧空的標記,每當插入心的棧頂元素時,指標top增加1,刪除棧頂元素時,指標top減1,因此,非空棧中的棧頂指標始終在棧頂元素的下乙個位置上。

(1)構造乙個空棧

status initstack(sqstack &s)
(2)獲取棧的棧頂元素

status gettop(sqstack s,selemtype e)
(3)插入元素

status push(sqstack &s,selemtype)

*s.top++=e;

return ok;

}

(4)刪除棧頂元素

status pop(sqstack &s,selemtype &e)
棧的鏈式表示:由於棧的操作是線性表操作的特例。則鏈棧的操作容易實現。

和棧相反,佇列是一種先進先出的線性表。它只允許在表的一端進行插入,而在另一端刪除元素。在佇列中,允許插入的一端叫做隊尾,允許刪除的一端則稱為對頭。

除了棧和佇列之外,還有一種限定的資料結構是雙端佇列。

雙端佇列是限定插入和刪除操作在表的兩端進行的線性表,這兩端分別稱為端點1和端點2.

和線性表類似,佇列也有兩種儲存方式。用鍊錶表示的佇列稱為鏈佇列。乙個鏈佇列顯然需要兩個分別指示對頭和隊尾的指標(分別簡稱頭指標和尾指標)才能唯一確定。這裡,和線性表的單鏈表一樣,為了操作方便起見,我們也給鏈佇列新增乙個頭結點,並令頭指標指向頭結點。由此,空的鏈佇列的判斷條件為頭指標和尾指標均指向頭結點。

鏈佇列的操作為單鏈表的插入和刪除操作的特殊情況,只是需要修改尾指標或者頭指標。

單鏈佇列--佇列的鏈式儲存結構

typedef struct qnodeqnode,*queueptr;

typedef structlinkqueue;

(1)初始化鏈佇列

status initqueue(linkqueue &q)
(2)銷毀佇列

status destoryqueue(linkqueue &q)

return ok;

}

(3)插入元素

status enqueue(linkqueue &q,qelemtype)
(4)刪除元素

status dequeue(linkqueue &q,qelemtype &e)
在上面的算大描述中,刪除佇列頭元素的演算法中的特殊情況,一般情況下,刪除佇列元素時需要修改頭結點中的指標,但是當佇列中最後乙個元素被刪除後,佇列中的尾指標也丟失了,因此需要對隊尾指標重新賦值(指向頭結點)。

和順序棧類似,在佇列的順序儲存結構中,除了用一組位址連續的儲存單元依次存放從佇列頭到佇列尾的元素之外,尚需設定兩個指標front和rear分別指示佇列元素以及隊尾元素的位置。為了在c語言中描述方便起見,在此我們約定:初始化建立空佇列時,令font=rear=0,每當插入新的佇列尾元素時,尾指標增加1,每當刪除佇列頭元素時,頭指標增加1.因此在非空佇列中,頭指標始終指向佇列頭元素,而尾指標始終指向佇列尾元素的下乙個位置。

假設當前為佇列分配的最大空間為6,則當佇列到了儲存位置的尾部時,則不可再繼續插入心的隊尾元素了,否則會因為陣列越界而使得**被破壞。然而此時又不合適的像順序棧那樣,進行儲存再分配擴大陣列空間,因為佇列的實際可用空間並未被佔滿。因此,可以將順序佇列構造成乙個環狀的空間稱為迴圈佇列。在這種結構中,如果僅僅憑藉q.front=q.rear是無法判定佇列空間是空還是滿的。因此有兩種處理方法:其一是另設乙個標誌位用來區分佇列是空還是滿,其二是少用乙個元素空間,約定以佇列頭指標在佇列尾指標的下乙個位置則作為佇列呈現滿的狀態的標誌。

從上述分析可見,在c語言中不能用動態分配的一維陣列來實現迴圈佇列。如果使用者的應用程式中設有迴圈佇列,則必須為它分配乙個最大佇列長度,若使用者無法預估所用佇列的最大長度,則採用鏈佇列。

#define maxsize 100//最大對列長度

typedef structsqueue;

(1)初始化佇列

status initqueue(sqqueue &q)
(2)獲取佇列的長度

int queuelength(sqqueue &q)
(3)插入元素

status enqueue(sqqueue &q,qelemtype)
(4)刪除元素

status dequeue(sqqueue &q,qelemtype &e)

(C語言)資料結構 佇列 棧

12 佇列 queue 入隊 put 出對get 1 2 file queue linkedlist.c 3 4 佇列 queue 5 入隊 put 放在鍊錶尾部,並更新指向鍊錶尾部的指標tail 6 出隊 get 返回並刪除鍊錶頭部節點,並更新指向鍊錶頭部的指標head 7 8 9 include...

C語言資料結構 棧 佇列

ifndef zydl h define zydl h include head.h define stack int size 100 define stackincrement 10 define duqueue max size 10 define maxqsize 100 typedef i...

資料結構 棧和佇列 c

標頭檔案 標頭.h include include using namespace std define stack init size 100 define stackincrement 10 define overflow 2 define error 0 define ok 1 define ...