版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第三章棧和隊列
第三章棧和隊列
3.1棧
3.2棧的應(yīng)用舉例
3.3棧與遞歸
3.4隊列
3.5隊列的應(yīng)用3.1棧3.1.1棧的概念
3.1.2棧的順序存儲和實現(xiàn)
3.1.3棧的鏈?zhǔn)酱鎯蛯崿F(xiàn)
3.1.1棧的概念棧是限定僅能在表尾一端進(jìn)行插入、刪除操作的線性表;(a1,a2,...ai,…,an-1,an
)插入刪除ana2a1棧的特點后進(jìn)先出又稱為后進(jìn)先出表(LIFO表Last_inFirst_out)出棧進(jìn)棧棧頂棧底ana2a13.1.1棧的概念棧的應(yīng)用火車調(diào)度123基本操作初始化操作InitStack(&S)
功能:構(gòu)造一個空棧S。銷毀棧操作DestroyStack(&S)
功能:銷毀一個已存在的棧。置空棧操作ClearStack(&S)
功能:將棧S置為空棧。判空操作StackEmpty(S)
功能:若棧S為空,則返回True,否則,棧不空返回False。ana2a1棧頂棧底
取棧頂元素操作GetTop(S,&e)
功能:取棧頂元素,并用e返回。
進(jìn)棧操作Push(&S,e)
功能:元素e進(jìn)棧。
退棧操作Pop(&S,&e)
功能:棧頂元素退棧,并用e返回。ana2a1棧頂棧底3.1.2棧的順序存儲和實現(xiàn)出棧進(jìn)棧棧頂棧底ana2a1
順序棧的類型定義#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10typedefstruct{
ElemType*base;//動態(tài)數(shù)組基址
intstacksize;//??臻g大小
}SqStack;SqStackS;ElemType*top//棧頂指針出棧進(jìn)棧棧頂棧底ana2a1S.stacksizeS.topS.base
an
an-1a2a110099 n-110topbaseaabcdab空棧
a進(jìn)棧
b,c,d進(jìn)棧d,c出棧topbasetopbasetopbase
順序棧的基本操作算法
約定:棧頂指針示棧頂元素的下一個位置
初始化操作InitStack(&S)功能:建空棧S.stacksizeS.topS.base100
99 n-110StatusInitList_Sq(SqStack&S){//建立空順序棧S
S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
//為順序棧動態(tài)分配存儲空間
if(!S.base)exit(OVERFLOW);//分配失敗
S.top=S.base;//棧頂指針初始化
S.stacksize=STACK_INIT_SIZE;returnOK;}//InitList_Sq
算法時間復(fù)雜度:O(1)S.stacksizeS.topS.base
an
an-1a2a110099 n-1100
銷毀棧操作DestroyStack(&S)
功能:銷毀一個已存在的棧NULLNULLStatusDestroyStack(SqStack&S){//銷毀一個已存在的棧
free(S.base);
//釋放棧空間
S.base=S.top=NULL;
S.stacksize=0;
returnOK;}//DestroyStack
置空操作ClearStack(&S)功能:將已存在的棧S,置成空棧99 n-110S.stacksizeS.topS.base
an
an-1a2a110099 n-110S.stacksizeS.topS.base
an
an-1a2a1100置空StatusDestroyStack(SqStack&S){//銷毀一個已存在的棧
S.top=NULL;
//釋放??臻g
returnOK;}//DestroyStack
進(jìn)棧操作
Push(&S,e)
e進(jìn)棧前e進(jìn)棧后功能:將元素e壓入棧頂S
an
an-1a2a1100
99 n-110S
ean
an-1a2a1100
99 n-110*S.top=e;S.top++;StatusPush(SqStack&S,ElemTypee){
//將元素e插入棧頂
*S.top=e;S.top++;
//元素e插入棧頂,修改棧頂指針
returnOK;
}//Pushif(S.top-S.base==S.stacksize)//棧滿
{newbase=(ElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);S.base=newbase;S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;}//if
出棧操作
Pop(&S,&e)功能:棧頂元素退棧,并用e返回。出棧操作前出棧操作后eanS
an
an-1a2a110099 n-110S
an
an-1a2a110099 n-110--S.top;e=*S.top;StatusPop(SqStack&S,ElemType&e){//刪除棧頂元素,并用e返回其值
if(S.top==S.base)returnERROR;//棧空
--S.top;e=*S.top;
//讀取棧頂元素,修改棧頂指針
returnOK;
}//PopS
an
an-1a2a110099 n-1103.1.3棧的鏈?zhǔn)酱鎯蛯崿F(xiàn)Sanan-1a1棧底棧頂typedefstructLNode{
ElemTypedata;
StructSNode*next;
}SNode,*SLinkList;SLinkListS;
//S棧頂指針3.1.3棧的鏈?zhǔn)酱鎯蛯崿F(xiàn)出棧e棧頂Sanan-1a1棧底e入棧棧頂Sanan-1a1棧底順序棧和鏈?zhǔn)綏5谋容^棧的特點:后進(jìn)先出時間效率所有操作都時間復(fù)雜度都是O(1)順序棧和鏈?zhǔn)綏T跁r間效率上難分伯仲空間效率順序棧須說明一個固定的長度鏈?zhǔn)綏5拈L度可變,但增加結(jié)構(gòu)性開銷
3.2棧的應(yīng)用舉例迷宮求解——搜索(深度優(yōu)先)行編輯程序表達(dá)式括號匹配的檢驗表達(dá)式求值實現(xiàn)遞歸其它退棧進(jìn)棧棧頂棧底ana2a1
數(shù)制轉(zhuǎn)換十進(jìn)制數(shù)到八進(jìn)制數(shù)的轉(zhuǎn)換算法基于下面整數(shù)性質(zhì)
N=(Ndivd)×d+
Nmodd43=5×8+3
例(1348)10=(2504)8
,其運算過程如下:=2×83+5×82+0×8+4
=(2504)8
=(21×8+0)×8+4
=(2×8+5)×8+0)×8+4
=168×8+41348=(1348div8)×8+1348mod8
voidconversion(){//輸入一個非負(fù)十進(jìn)制數(shù),輸出八進(jìn)制數(shù)
InitStack(S);//建空棧
scanf(“%d”,N);//輸入一個非負(fù)十進(jìn)制整數(shù)
while(N){//N不等于零循環(huán)
Push(S,N%8);//余數(shù)進(jìn)棧
N=N/8;//整除運算,N=商
}
while(!StackEmpty){//輸出棧中的八制數(shù)位
Pop(S,e);Printf(“%d”,e);
}
DestroyStack(S);//釋放棧空間
}//conversion
迷宮問題輸入數(shù)據(jù):迷宮結(jié)果數(shù)據(jù):從入口到出口的一條路徑入口出口1234入口出口1234迷宮問題迷宮問題求解迷宮問題的基本步驟若當(dāng)前位置“可通”,則納入路徑,繼續(xù)探索;若當(dāng)前位置“不可通”,換個方向繼續(xù)探索;若四周“均已探索”,則后退一步,換個方向繼續(xù)探索;入口出口1234括號匹配問題在表達(dá)式中,正確的格式([]())[([][])]在表達(dá)式中,不正確的格式:[(])())(()main(){…x=2;y=3;
z=x*x+y*y;}表達(dá)式求值-算符優(yōu)先算法表達(dá)式的構(gòu)成
表達(dá)式::=操作數(shù)+運算符+界符5+6(1+2)–4212355+6(1+2)–42表達(dá)式的求值
(數(shù)學(xué)上)4=5+63-42=5+18-42=23-42=23-8=151)確定表達(dá)式中算符運算順序
2)按照算符的運算順序進(jìn)行計算算符優(yōu)先關(guān)系表(1、2是相鄰算符,1
左,2右)
1、2的優(yōu)先關(guān)系有:1<2
1=2
1>22
1
+-*/()#>><<<>>>
><<<>>>>>><>>>>>><>><<<<<=>>>>>><<<<<=+-*/()##5+6(1+2)-42#表達(dá)式求值基本思路+(
從左向右掃描表達(dá)式:#5+6(1+2)-42
?
遇操作數(shù)——保存
?
遇運算符j
——與左運算符i比較
–若i<j
則保存
–若i>j
則i可進(jìn)行運算;
–若i=j
需要消去括號;5612+<<<#<>后保存運算符優(yōu)先級高OPTR棧#OPND棧5+6×(1+25
讀入表達(dá)式:+6×(1+2)-4#1+2=36×3=185+18=2323-8=15表達(dá)式求值示意圖(算符優(yōu)先算法)1823-15×24×2=84×832
算符優(yōu)先算法OperandTypeEvaluateExpression(){//算術(shù)表達(dá)式求值的算符優(yōu)先算法。設(shè)OPTR和OPND分別為運算符棧和操作數(shù)棧,OP為運算符集合。
InitStack(OPTR);Push(OPTR,#);InitStack(OPND);c=getchar();//讀入算術(shù)表達(dá)式
while(c!=‘#’||GetTop(OPTR)!=‘#’){if(!In(c,OP))//若為操作數(shù)進(jìn)棧OPND{Push(OPND,c);c=getchar()}else{//若為運算符
switch(Precede(GetTop(OPTR),c)){case<://運算符進(jìn)棧并接收下一字符
Push(OPTR,c);c=getchar();break;case=://脫括號并接收下一字符
Pop(OPTR,x);c=getchar();break;case>:Pop(OPTR,theta);Pop(OPND,b);Pop(OPND,a);Push(OPND,Operate(a,theta,b));break;}//switch}//if}//whilereturnGetTop(OPND);}//EvaluateExpression
中綴表達(dá)式5+6(1+2)–425612++42
-1234
后綴表達(dá)式
前綴表達(dá)式-+56+12421234
表達(dá)式的三種表達(dá)方式55例求解n!的遞歸函數(shù)
intfact(intn){if(n==1)return1;elsereturn(n*fact(n-1));}3.3棧與遞歸A(){…A();…}遞歸函數(shù)遞歸函數(shù)的執(zhí)行過程中棧的作用函數(shù)的調(diào)用數(shù)據(jù)傳遞控制轉(zhuǎn)移main(){intn=3;f(n);}intf(intn){r=1;for(i=1;i<=n;i++)
r=r*i;return(r);}調(diào)用返回遞歸函數(shù)的執(zhí)行過程中棧的作用主調(diào)函數(shù)時涉及的數(shù)據(jù)函數(shù)實參返回地址被調(diào)函數(shù)涉及的數(shù)據(jù)函數(shù)形參局部變量函數(shù)返回值函數(shù)數(shù)據(jù)區(qū)參數(shù)返回地址等局部變量遞歸函數(shù)的執(zhí)行過程中棧的作用(被調(diào))函數(shù)數(shù)據(jù)區(qū)的分配對于非遞歸函數(shù),數(shù)據(jù)區(qū)的分配可以在程序運行前進(jìn)行,直到整個程序運行結(jié)束才釋放,這種分配稱為靜態(tài)分配。內(nèi)存代碼區(qū)域全程/靜態(tài)區(qū)域動態(tài)區(qū)域intf(intn){r=1;for(i=1;i<=n;i++)
r=r*i;return(r);}main(){intn=3;f(n);}main(){intn=3;fact(n);}intfact(intn){if(n==1)return(1);
elsereturn(n*fact(n-1));}調(diào)用n=3返回intfact(intn){if(n==1)return(1);
elsereturn(n*fact(n-1));}調(diào)用n=2返回參數(shù)返回地址等局部變量遞歸函數(shù)的執(zhí)行過程中棧的作用函數(shù)數(shù)據(jù)區(qū)的分配對于遞歸函數(shù),必須每調(diào)用一次就分配一塊新的數(shù)據(jù)區(qū),以存放當(dāng)前函數(shù)所使用的數(shù)據(jù),當(dāng)函數(shù)結(jié)束返回時隨即釋放。即所謂的動態(tài)分配。代碼區(qū)域全程/靜態(tài)區(qū)域動態(tài)區(qū)域內(nèi)存
函數(shù)返回順序main()fac
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- -記上海第二醫(yī)科大學(xué)病理生理學(xué)教研室主任陳國強知識講解
- 會計學(xué)第九章財產(chǎn)清查
- 2024年浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 一年級道德與法治上冊第一單元我是小學(xué)生啦1開開心心上學(xué)去課件新人教版
- 2024年浙江醫(yī)藥高等專科學(xué)校高職單招語文歷年參考題庫含答案解析
- 產(chǎn)品宣傳冊設(shè)計合同8篇
- 2024年陸軍五十七醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年陽泉市城區(qū)人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年江陽城建職業(yè)學(xué)院高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 2024年江蘇海事職業(yè)技術(shù)學(xué)院高職單招語文歷年參考題庫含答案解析
- YY/T 1705-2020外科植入物髖關(guān)節(jié)假體陶瓷股骨頭抗沖擊性能測定方法
- GB/T 6730.22-2016鐵礦石鈦含量的測定二安替吡啉甲烷分光光度法
- GB/T 22898-2008紙和紙板抗張強度的測定恒速拉伸法(100 mm/min)
- 高血壓疾病證明書
- GA 763-2008警服V領(lǐng)、半高領(lǐng)毛針織套服
- (完整word版)兒童迷宮圖 清晰可直接打印
- 華東師大版數(shù)學(xué)七年級上冊1數(shù)軸課件
- 塑膠件噴油作業(yè)指導(dǎo)書
- (完整)碘造影劑的理化性質(zhì)幾種常用碘造影劑的比較新ppt
- DB33-T 2267-2020養(yǎng)老機構(gòu)護(hù)理分級與服務(wù)規(guī)范
- 2022國慶節(jié)復(fù)工第一課
評論
0/150
提交評論