棧的定義
棧是限定僅在表尾進行插入和刪除操作的線性表。(注意:表尾,線性表)
所以棧又被稱為後進先出的線性表。(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 兩棧的共享空間 此...