資料結構學習之四 棧與佇列(一)

2021-10-01 04:51:30 字數 2627 閱讀 8460

棧的定義

棧是限定僅在表尾進行插入和刪除操作的線性表。(注意:表尾,線性表)

所以棧又被稱為後進先出的線性表。(last in first out)【這也是棧的特點】

我們將允許插入和刪除的一端稱為棧頂(top),另一端則稱為棧底(bottom)。

棧的插入操作,被稱為進棧(也稱壓棧入棧),棧的刪除操作,被稱為出棧(也稱彈棧)。

補充:先入棧的必然後出棧,順序不能顛倒。

棧的順序儲存結構

棧是一種特殊的線性表,所以棧的順序儲存也就是線性表的順序儲存的特殊情況,可以稱之為順序棧,使用陣列來儲存實現。

定義乙個top用來指示棧頂元素的位置,乙個儲存棧的最大長度stacksize,top必須小於stackszie。當棧為空時,top=-1。棧滿是top=stacksize-1。

棧的定義如下:

typedef

int selemtype;

typedef

struct

sqstack;

順序棧的進棧操作

即棧的插入操作,其詳細操作就是讓棧頂指標加一,然後將新插入的元素賦值給棧頂空間。**如下:

status push

(sqstack *s,selemtype e)

順序棧的出棧操作

即棧的刪除操作,詳細操作:將要刪除的棧頂元素賦值,top減一。

詳細**如下:

status pop

(sqstack *s,selemtype e)

兩棧共享空間

兩個棧共用乙個陣列進行儲存,讓兩個棧的棧底分別作為陣列的兩個端點(起始和末尾),兩個棧頂均向陣列的中間靠攏。只要兩個棧頂指標不相遇,那麼就代表棧未滿,可以繼續使用。

兩棧共享空間的結構**:

typedef

struct

sqdoublestack;

假設進行儲存的陣列大小為maxsize,棧1從陣列的起始開始,棧2從陣列的末尾開始,則:當棧1為空時,top1==-1,當棧2為空時top2==maxsize。

但是棧滿的情況需要多方面考慮:

若棧1為空,棧2的top2==0,此時棧滿

若棧2為空,棧1的top1==maxsize-1,此時棧滿

當兩個棧相遇時,兩個指標之間相差1,此時棧滿

綜上所述,可以將這些情況折合成一種情況,即top1+1==top2時,棧滿。

兩棧共享空間的push方法:

status push

(sqdoublestack *s,selemtype e,

int stacknumber)

兩棧共享空間的pop方法:

status pop

(sqdoublestack *s,selemtype e,

int stacknumber)

else

if(stacknumber==2)

return true;

}

棧的鏈式結構儲存

使用鍊錶來實現棧的鏈式儲存,簡稱為鏈棧

棧頂放在單鏈表的頭部,實現鏈棧的後進先出。一般而言,對於鏈棧來講,是不需要頭結點的。因為頭結點失去了意義,top指標直接指向鏈棧的棧頂。

鏈棧的結構**如下:

typedef

struct stacknode

stacknode,

*linkstackptr;

typedef

struct linkstack

linkstack;

對於鏈棧來說,基本不存在棧滿的情況,其儲存空間的大小是動態的。當其為空時,top==null。

鏈棧的進棧操作

假設插入的新結點是s,top為棧頂指標,則其**如下:

status push

(linkstack *s,selemtype e)

鏈棧的出棧操作

假設刪除的結點是p,top為棧頂指標,則鏈棧的出棧**如下:

status pop

(linkstack *s,selemtype *e)

順序棧和鏈棧的優劣性比較

順序棧在訪問方面有著優點,但是必須要固定乙個長度(儲存於陣列中,陣列要有固定的長度),而且會存在記憶體空間浪費的情況。

鏈棧有著長度無限制的優點,但是需要多增加指標域,增加了記憶體的使用。

如果棧的使用過程中,元素的數量在可控的範圍內,使用順序棧更好,但是如果元素的數量不能確定其變化範圍,最好使用鏈棧。

資料結構學習之棧 佇列等

gdb除錯段錯誤 1.ulimit c unlimited 2.ulimit c 1000 3.gcc 檔案 g 4.執行程式 a.out 生成core檔案 5.gdb a.out core 順序棧1.出棧 datatype popseqstack seqstack stack 功能 從順序棧中出棧...

資料結構學習筆記 棧與佇列

二 佇列 總結參考文獻 棧和佇列的資料操作範圍僅限於邏輯上特定的某端,棧先進後出,佇列先進先出。操作介面 功能返回型別 size 報告棧的規模 intempty 判斷棧是否為空 bool push e 將e插至棧頂 void pop 刪除棧頂物件 ttop 引用棧頂物件 t include vect...

資料結構學習 棧和佇列

棧是限定僅在表尾進行插入和刪除操作的線性表。我們把插入和刪除的一段稱為棧頂,另一端稱為棧底,不含任何元素的棧稱為空棧。由於棧本身是乙個線性表,因此棧的儲存方式也有兩種,分別是順序儲存和鏈式儲存。既然棧是線性表的特列,那麼棧的順序儲存其實也是線性表順序儲存的簡化。我們稱為順序棧。1 兩棧的共享空間 此...