4 1 0 棧的順序儲存結構及實現

2021-08-16 19:02:44 字數 1723 閱讀 7056

/*順序棧結構*/

typedef

struct

sqstack;

棧普通情況、空棧和棧滿的情況示意圖:

邏輯圖:

/*插入元素e為新的棧頂元素*/

status push(sqstack *s, selemtype e)

/*若棧不空,則刪除s的棧頂元素,用e返回其值,並返回ok;否則返回error*/

status

pop(sqstack *s, selemtype *e)

相關變數定義

#define ok 1

#define error 0

#define true 1

#define false 0

#define maxsize 20 /*儲存空間初始分配量*/

typedef int status;

typedef int selemtype;/*selemtype 型別根據實際情況而定,這裡假設為int*/

如圖,陣列有兩個端點,兩個棧有兩個棧底,讓乙個棧的棧底為陣列的始端,即下標為 0 處 ,另乙個棧為棧的末端,即下標為陣列長度n-1處。這樣,兩個棧如果增加元素,就是兩端點向中間延伸。

其實關鍵思路是:它們是在陣列的兩端,向中間靠攏。top1 和 top2 是棧1和棧2的棧頂指標,可以想象,只要它們倆不見面,兩個棧就可以一直使用。從這裡也就可以分析出來,棧 1 為空時,就是 top1 等於-1 時;而當 top2 等於n 時,即是棧 2 為空時,那什麼時候棧滿呢?想想極端的情況,若棧2是空棧,棧1的 topl 等於 n-1時,就是棧1滿了 。 反之,當棧 1為空棧時, top2 等於0時,為棧 2 滿。 但更多的情況,其實就是我剛才說的,兩個棧見面之時,也就是兩個指標之間相差 1時,即 top1+1= top2 為棧滿。

儲存結構:

/*兩棧共享空間*/

typedef

struct

sqdoublestack;

插入操作:

/*插入元素e為新的棧頂元素*/

status

pushd(sqdoublestack *s, selemtype e, int stacknumber)

else

if (stacknumber==2) /*棧2元素進棧*/

return ok;

}

出棧操作:

status

popd(sqdoublestack *s, selemtype *e, int stacknumber)

else

if (stacknumber == 2)

return ok;

}

棧的順序儲存結構及實現

棧是線性表的特例,棧只在棧頂進行插入及刪除操作,因此資料是後進先出。棧的順序儲存其實也是線性表順序儲存的簡化。棧的結構定義如下 進棧操作push,其 如下 插入元素e為新的棧頂元素 stauts push sqstack s,selemtype e s top 棧頂指標 1 s data s top...

棧的順序儲存結構實現。

ifndef stack h define stack h define size 5 typedef structstack 初始化棧的儲存區 void stack init stack 清理棧的儲存區 void stack deinit stack 判斷棧是不是滿了 int stack full...

棧的順序儲存實現及鏈式儲存實現

include include define size 100 typedef int elemtype typedef struct stackstack void init stack s 初始化 intpush stack s,elemtype e 入棧 s s s top e 從s 1 開始...