資料結構 共享棧和鏈式結構棧

2021-10-04 03:09:56 字數 1420 閱讀 1364

共享棧其實就是兩個棧,合起來,共享乙個陣列存資料。這樣子的好處就是,兩個棧同乙個空間。當棧1的資料多,棧2資料比較少,就可以這樣子共享,對空間的浪費就會減少。當棧1為空,top1 = -1;棧2為空,top2 = n;

關鍵:有兩個棧底,和兩個棧頂top1,top2,從陣列兩端向中間靠攏。當 top1 + 1 = top2 的時候為棧滿。

/*兩棧共享空間結構*/

typedef

struct

sqdoublestack;

這個和順序棧不同的就是,要指定,是棧1還是棧2插入。所以這裡就有乙個stacknumber來表示棧的引數。

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

status push (sqdoublestack *s,

int e,

int stacknumber)

/*出棧和刪除*/

status pop (sqdoublestack *s,

int*e,

int stacknumber)

else

if(stacknumber ==2)

return ok;

}

ps:一般運用共享棧的時候,是用於兩個棧資料加起來是乙個確定的數,乙個棧增加,那另乙個棧會減少。這樣子共享棧就可以靈活得分配空間。一定是同種型別的棧才能定義成共享棧,不然問題反而會變得更複雜。

就是把棧和鍊錶結合起來,把棧頂放在單鏈表的頭部,指標放在top裡面。如果是連式結構,棧就是無限的,不會有順序棧對棧大小的限制。鏈棧的空就是top = null;

/*鏈棧的結構定義*/

typedef

struct stacknode

stacknode,

*linkstackptr;

typedef

struct linkstack

linkstack;

先放值,再上移。

/*插入元素*/

status push

(linkstack *s,

int e)

和鍊錶操作差不多,取值,指標下移,釋放。

/*出棧操作*/

status pop

(linkstack *s,

int*e)

ps:鏈棧在訪問資料時間複雜度都是o[1],看起來比順序鍊錶的操作和理解要難一點兒,而且指標也需要記憶體。但是因為鍊錶無限的性質,不容易造成空間浪費,在一些波動幅度較大的資料,可以用鏈棧。但是如果比較可控,我更喜歡順序棧,看起來簡單一點兒。

本部落格**參考程杰《大話資料結構》

資料結構 順序棧和鏈式棧

棧 限定在表尾進行插入和刪除操作的線性表。允許插入和刪除的一端成為棧頂,另一端稱為棧底。棧的操作特性 後進先出 順序棧 設定top指標指示棧頂元素在陣列中的位置。進棧 top 1 棧空 top 1 出棧 top 1 棧滿 top maxsize const int max size 100 temp...

資料結構 鏈式棧

編譯錯誤 passing const linkstack as this argument discards qualifiers fpermissive 解決方法 c 中const 引用的是物件時只能訪問該物件的const 函式,因為其他函式有可能會修改該物件的成員,編譯器為了避免該類事情發生,會...

資料結構 棧 棧的鏈式儲存結構

資料結構 棧 棧的鏈式儲存結構 用頭插法建立的鏈棧,棧頂元素為s next所指結點 date 2017 4 14 include include define initsize 100 define elemtype char typedef struct lnode linkstack void ...