順序棧及其運(yùn)算_第1頁(yè)
順序棧及其運(yùn)算_第2頁(yè)
順序棧及其運(yùn)算_第3頁(yè)
順序棧及其運(yùn)算_第4頁(yè)
順序棧及其運(yùn)算_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、順序棧    棧的順序存儲(chǔ)結(jié)構(gòu)簡(jiǎn)稱為順序棧,它是運(yùn)算受限的順序表。1、 順序棧的類型定義  #define StackSize 100 /假定預(yù)分配的??臻g最多為100個(gè)元素  typedef char DataType;/假定棧元素的數(shù)據(jù)類型為字符  typedef struct      DataType dataStackSize;      int top;     SeqStack; &

2、#160; 注意:    順序棧中元素用向量存放    棧底位置是固定不變的,可設(shè)置在向量?jī)啥说娜我庖粋€(gè)端點(diǎn)    棧頂位置是隨著進(jìn)棧和退棧操作而變化的,用一個(gè)整型量top(通常稱top為棧頂指針)來(lái)指示當(dāng)前棧頂位置2、 順序棧的基本操作   前提條件:    設(shè)S是SeqStack類型的指針變量。若棧底位置在向量的低端,即S-data0是棧底元素。(1) 進(jìn)棧操作    進(jìn)棧時(shí),需要將S-top加1  注意: &#

3、160;  S-top=StackSize-1表示棧滿"上溢"現(xiàn)象-當(dāng)棧滿時(shí),再做進(jìn)棧運(yùn)算產(chǎn)生空間溢出的現(xiàn)象。      上溢是一種出錯(cuò)狀態(tài),應(yīng)設(shè)法避免。(2) 退棧操作    退棧時(shí),需將S-top減1  注意:    S-top<0表示空棧    "下溢"現(xiàn)象當(dāng)??諘r(shí),做退棧運(yùn)算產(chǎn)生的溢出現(xiàn)象。      下溢是正?,F(xiàn)象,常用作程序控制轉(zhuǎn)

4、移的條件。順序棧在進(jìn)棧和退棧操作時(shí)的具體變化情況【參見動(dòng)畫演示】3、順序棧的基本運(yùn)算(1) 置棧空  void InitStack(SeqStack *S)    /將順序棧置空        S->top=-1;    (2) 判???#160; int StackEmpty(SeqStack *S)            return S->top=-1;

5、60;   (3) 判棧滿  int StackFull(SeqStack *SS)            return S->top=StackSize-1;     (4) 進(jìn)棧  void Push(S,x)            if (StackFull(S)   

6、0;         Error("Stack overflow"); /上溢,退出運(yùn)行       S->data+S->top=x;/棧頂指針加1后將x入棧     (5) 退棧  DataType Pop(S)          if(StackEmpty(S)  

7、60;        Error("Stack underflow"); /下溢,退出運(yùn)行      return S->dataS->top-;/棧頂元素返回后將棧頂指針減1    (6) 取棧頂元素  DataType StackTop(S)           if(StackEmpty(S) 

8、60;         Error("Stack is empty");       return S->dataS->top;     4、兩個(gè)棧共享同一存儲(chǔ)空間    當(dāng)程序中同時(shí)使用兩個(gè)棧時(shí),可以將兩個(gè)棧的棧底設(shè)在向量空間的兩端,讓兩個(gè)棧各自向中間延伸。當(dāng)一個(gè)棧里的元素較多,超過(guò)向量空間的一半時(shí),只要另一個(gè)棧的元素不多,那么前者就可以占用后者的部分存

9、儲(chǔ)空間。    只有當(dāng)整個(gè)向量空間被兩個(gè)棧占滿(即兩個(gè)棧頂相遇)時(shí),才會(huì)發(fā)生上溢。因此,兩個(gè)棧共享一個(gè)長(zhǎng)度為m的向量空間和兩個(gè)棧分別占用兩個(gè)長(zhǎng)度為 m/2和m/2的向量空間比較,前者發(fā)生上溢的概率比后者要小得多。順序棧   與線性表類似棧也有兩種存儲(chǔ)結(jié)構(gòu),即順序存儲(chǔ)結(jié)構(gòu)和鏈表存儲(chǔ)結(jié)構(gòu)。棧的順序存儲(chǔ)結(jié)構(gòu)亦稱為順序棧,它是運(yùn)算受限的順序表。1、 順序棧的類型定義  const int MAXSIZE=100; /假定預(yù)分配的棧空間最多為100個(gè)元素  typedef int ElemType;/假定棧元素的數(shù)據(jù)類型為整

10、型  struct SqStack ElemType elemMAXSIZE; /一維數(shù)組      int top;/指針top指向棧頂元素的當(dāng)前位置       注意:    SqStack就是棧的順序存儲(chǔ)結(jié)構(gòu)的類型標(biāo)識(shí)符。    順序棧中元素用向量存放    棧底位置是固定不變的,可設(shè)置在向量?jī)啥说娜我庖粋€(gè)端點(diǎn)    棧頂位置是隨著進(jìn)棧和退棧操作而變化的,用一個(gè)

11、整型量top(通常稱top為棧頂指針)來(lái)指示當(dāng)前棧頂位置 例:假設(shè)MAXSIZE取值為,圖.2展示了順序棧S中數(shù)據(jù)元素和棧頂指針的關(guān)系。為了與前文所述top=0為空棧相一致,圖中未畫出S.elem0。邏輯上可利用有效空間為S.elem1,.,S.elem5。2、 順序棧的基本操作   前提條件:    設(shè)S是SeqStack類型的指針變量。若棧底位置在向量的低端,即S.elem0是棧底元素。(1) 進(jìn)棧操作    進(jìn)棧時(shí),需要將top加1  注意:   top=MAXSIZE-1表示棧

12、滿   "上溢"現(xiàn)象-當(dāng)棧滿時(shí),再做進(jìn)棧運(yùn)算產(chǎn)生空間溢出的現(xiàn)象。      上溢是一種出錯(cuò)狀態(tài),應(yīng)設(shè)法避免。【算法3.1】void SqStack:push( ElemType e) if(top= =MAXSIZE-1)cout<<"棧滿溢出"<<endl;exit(1);else top+;elemtop=e;(2) 退棧操作    退棧時(shí),需將top減1  注意:    top

13、<0表示空棧    "下溢"現(xiàn)象當(dāng)??諘r(shí),做退棧運(yùn)算產(chǎn)生的溢出現(xiàn)象。      下溢是正?,F(xiàn)象,常用作程序控制轉(zhuǎn)移的條件?!舅惴?.2】ElemType SqStack:pop()ElemType x;if(top= =0) cout<< " 棧為空,不能出棧操作"<<endl; exit(1);else x=elemtop;top-;return x;順序棧在進(jìn)棧和退棧操作時(shí)的具體算法演示請(qǐng)點(diǎn)擊查看【算法演示】3、兩個(gè)棧共享同一存儲(chǔ)空間    順序存儲(chǔ)結(jié)構(gòu)條件下的多棧操作也是數(shù)據(jù)結(jié)構(gòu)課程所討論的內(nèi)容。在計(jì)算機(jī)系統(tǒng)軟件中,諸如各種高級(jí)語(yǔ)言的編譯軟件都離不開棧的操作,且往往是同時(shí)使用和管理多個(gè)棧。若讓多個(gè)棧共用一個(gè)向量,其管理和運(yùn)算都很復(fù)雜,這里僅介紹兩個(gè)棧共用一個(gè)向量的問(wèn)題。兩個(gè)棧共用一個(gè)向量又有不同的分配方法。如圖3.3所示。圖3.3(a)的方法是將向量平均分配給兩個(gè)棧(設(shè)向量有n個(gè)元素),它們的棧底分別在下標(biāo)為0和下標(biāo)為

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論