共享棧其實就是兩個棧,合起來,共享乙個陣列存資料。這樣子的好處就是,兩個棧同乙個空間。當棧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 ...