知識總覽:
順序棧的定義:
順序棧是用順序存儲實現的 ,代碼定義方式和順序表類似(啥是順序表來著???)
定義一個順序棧struct結構體SqStack,結構體中有靜態數組data來存放棧里邊的元素+1個int型的top指針用來指向棧頂元素(該指針一般記錄的是棧頂元素的索引下標,data數組索引下標從0開始),聲明一個順序棧SqStack S;后會在內存分配一塊連續的內存空間(應該是因為是順序存儲),空間大小為data數組中的每個元素所占空間大小*元素個數(MaxSize * sizeOf(ElemType))+top指針占用空間(int型的占4Byte),比如說空間大小是10,依次壓棧進入5個元素a、b、c、d、e,則現在top指向e元素的位置(不是指向沒有元素的最上方),即top=4(e的索引下標)
聲明棧SqStack S:
此時棧里邊data數組元素為空,即棧頂元素為空,則讓top指針指向-1位置,而不是data[0]位置==》因此,判斷棧空,就用S.top==-1即可
以下為S.top指針指向棧頂元素位置(即開始棧頂元素為空,則指向-1位置)====》現在時,和壓棧元素同呼吸共命運
初始化棧:
讓top指針指向-1位置,即S.top == -1;
進棧操作:
因為數組的長度是固定的,所以每次進棧前都要判斷指向棧頂元素的top指針表示的索引位置==Maxsize-1,相等這表示要數組下標越界了,注意每次top指針指向的索引位置都是要進來的元素位置,所以每次進棧的時候都要讓當前的top+1先操作,再把元素放到top+1位置,即讓top先挪位置,再把元素放進來,++top前++,先自身+1再執行操作
出棧操作:
出棧前先判斷棧里邊還有沒有元素即判斷棧是否空,有元素才出棧,即用S.top==-1判斷,出棧要把出棧元素返回用引用X返回,出棧時只是把數組里的元素邏輯上刪除了,但是該元素還依然存在內存(因為該元素用X返回了),出棧時先把該元素出棧再讓S.top-1,即先讓當前棧頂元素騰地出去賦值給X,再讓棧頂元素指針下移,先操作再自身-1,S.top--
讀棧頂元素操作:
和上邊出棧類似,只是沒有S.top指針下移,只是把棧頂元素返回,棧頂元素依然不變
以下為棧頂指針指向下一個元素可以插入的位置(即開始棧為空,下一個元素要插入的位置是0,即讓棧頂指針指向0位置)===》未來式,等待式,即棧頂指向的位置肯定是沒值的:
故判斷棧空用S.top==0,進棧時判斷棧滿用S.top==MaxSize,出棧時棧空用S.top==0,出棧時先S.top-1先把指針下移指向要出棧的元素位置
回收棧:即讓棧頂指針指向-1,即讓棧空即可,然后內存中的空間自動回收,不用使用malloc函數
缺點:順序棧是用靜態數組存儲實現的,靜態數組長度固定,導致棧的大小不可改變,可以用鏈式存儲的方式實現改變缺點,也可以開始申請一大片連續的內存空間,但是申請了不用又浪費,
共享棧:
2個棧共用一片連續的內存空間,解決申請一大片連續內存空間浪費的情況
2個棧有2個棧頂指針,開始2個棧都為空,0號棧棧頂指針指向-1,1號棧棧頂指針指向MaxSize【即2個棧頂指針用的都是現在式,要入棧的話,0號棧先top+1,1號棧先top-1】,即0號棧入棧從下往上走,1號棧入棧從上往下走,當0號棧的S.top+1==1號棧的S.top,或者1號棧的S.top-1==0號棧的S.top證明共享棧已滿,2個棧物理上共用一塊連續空間
?
知識回顧:
?
?。。。。。。。。。