版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第3章 棧和隊列3.1 棧3.2 棧的應(yīng)用舉例 3.2.1 數(shù)制轉(zhuǎn)換 3.2.2 括號匹配的檢驗 3.2.3 行編輯程序 3.2.4 迷宮求解 3.2.5 表達(dá)式求值3.3 棧與遞歸的實現(xiàn)3.4 隊列 通常用“窮舉求解”方法。3.2.4 迷宮求解求迷宮路徑算法的基本思想是:若當(dāng)前位置“可通”,則納入路徑,繼續(xù)前進(jìn);若當(dāng)前位置“不可通”,則后退,換方向繼續(xù)探索;若四周“均無通路”,則將當(dāng)前位置從路徑中刪除出去。1 1 11 2 22 2 23 2 13 3 13 4 42 4 12 5 12 6 41 6 31 5 31 4 43$設(shè)定當(dāng)前位置的初值為入口位置; do 若當(dāng)前位置可通, 則將當(dāng)前
2、位置插入棧頂; 若該位置是出口位置,則算法結(jié)束; 否則切換當(dāng)前位置的東鄰方塊為 新的當(dāng)前位置; 否則 求迷宮中一條從入口到出口的路徑的算法: 若棧不空且棧頂位置尚有其他方向未被探索,則設(shè)定新的當(dāng)前位置為: 沿順時針方向旋轉(zhuǎn) 找到的棧頂位置的下一相鄰塊;若棧不空但棧頂位置的四周均不可通,則刪去棧頂位置; / 從路徑中刪去該通道塊 若棧不空,則重新測試新的棧頂位置, 直至找到一個有可通相鄰塊的位置 或出棧至???; while (棧不空);若???,則表明迷宮沒有通路。第3章 棧和隊列3.1 棧3.2 棧的應(yīng)用舉例 3.2.1 數(shù)制轉(zhuǎn)換 3.2.2 括號匹配的檢驗 3.2.3 行編輯程序 3.2.4
3、迷宮求解 3.2.5 表達(dá)式求值3.3 棧與遞歸的實現(xiàn)3.4 隊列 3.2.5 表達(dá)式求值以表達(dá)式 A*B + CD 為例說明利用棧的求值過程: 操作數(shù):常數(shù)、變量或常量標(biāo)識符 運算符:* / * + - 界限符: ( ) # 優(yōu)先級:運算符和界限符統(tǒng)稱算符。思想:從左到右掃描表達(dá)式,若當(dāng)前讀入的是操作數(shù),則進(jìn)操作數(shù)(NS)棧,若讀入的符號是算符,應(yīng)進(jìn)行判斷:若是“(”,進(jìn)運算符棧;若是“)”,當(dāng)運算符棧頂是“(”,則彈出棧頂元素,繼續(xù)掃描下一符號。否則當(dāng)前讀入符號暫不處理,從操作數(shù)棧彈出兩個操作數(shù),從運算符棧彈出一個運算符,生成運算指令,結(jié)果送入操作數(shù)棧,繼續(xù)處理當(dāng)前讀入符號。2. 若讀入的
4、運算符的優(yōu)先級大于運算符棧頂?shù)膬?yōu)先級,則進(jìn)運算符棧,繼續(xù)掃描下一符號;否則從操作數(shù)棧頂彈出兩個操作數(shù),從運算符棧彈出一個運算符,生成運算指令,把結(jié)果送入操作數(shù)棧。繼續(xù)處理剛才讀入的符號。3. 若讀入的是“#”,且算符棧頂?shù)姆栆彩恰?”時,則表達(dá)式處理結(jié)束。從操作數(shù)棧彈出表達(dá)式結(jié)果。A*B + C/Dtop2top1初態(tài)#(a)OSNSBA*#(b)NSOST1#(c)T1=A*BNSOSDCT1/+#(d)NSOS(g)NSOST2=C/DT2T1+#(e)NSOST3#(f)T3=T2+T1NSOS算術(shù)表達(dá)式求值的算符優(yōu)先算法。OperandType EvaluateExpressiOn
5、( ) /設(shè)OPTR和OPND分別為運算符棧和運算數(shù)棧。OP為運算符集合。 InitStack(OPTR); InitStack(OPND); Push(OPTR,#); c=getchar();while (c !=#| GetTop(OPTR)!=#)if(!In(c,OP) /不是運算符則進(jìn)棧 Push(OPND,c); c=getchar( ); elseswitch ( Precede ( GetTop (OPTR),c)case : /退棧并將運算結(jié)果入棧Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,t
6、heta,b);break ;/注意這里無c=getchar() /swith/whilereturn GetTop(OPND); /end of EvaluateExpression 由于棧結(jié)構(gòu)具有的后進(jìn)先出的特性,致使棧成為程序設(shè)計中的有用工具。在系統(tǒng)軟件設(shè)計以及應(yīng)用軟件中解決實際問題都有廣泛的應(yīng)用。 棧的其他應(yīng)用還有:子程序的調(diào)用、處理遞歸調(diào)用、二叉樹的遍歷、圖的深度優(yōu)先搜索法等。第3章 棧和隊列3.1 棧3.2 棧的應(yīng)用舉例3.3 棧與遞歸的實現(xiàn)3.4 隊列 3.3 棧與遞歸的實現(xiàn) 當(dāng)求解一個問題時,是通過求解與它同樣解法的子問題而得到的,這就是遞歸。 或理解為子程序或函數(shù)反復(fù)的調(diào)用自
7、己,并傳入不同的變量來執(zhí)行的一種程序設(shè)計技巧。 是程序設(shè)計及解題的一種有力的、重要的工具,幫助程序設(shè)計者解決復(fù)雜問題,并精簡程序結(jié)構(gòu)。例:設(shè)計一個乘法器,可以計算出兩個數(shù)相乘的乘積。但是此時計算機(jī)不能提供乘法運算(僅知道任何數(shù)乘 1,其值不變),則唯一可以使用的運算方式就是加法運算。即: 11 * 3是 11 連加 3 次 (11 * 3) = 11 + (11 * 2) = 11 + (11 + (11 * 1)) = 11 + (11 + 11) = 11 + 22 = 33使用遞歸的一個重要問題 一個遞歸的求解問題必然包含有終止遞歸的條件,當(dāng)滿足一定條件時就終止向下遞歸,從而使問題得以解
8、決。 解決遞歸問題的算法稱遞歸算法,在遞歸算法中需要根據(jù)遞歸條件直接或間接地調(diào)用算法本身,當(dāng)滿足某種條件時結(jié)束遞歸調(diào)用。當(dāng)然對于一些簡單的遞歸問題,很容易把它轉(zhuǎn)換為循環(huán)問題解決,從而使編寫出的算法更為有效。將所有的實在參數(shù)、返回地址等信息傳遞給被調(diào)用函數(shù)保存;為被調(diào)用函數(shù)的局部變量分配存儲區(qū);將控制轉(zhuǎn)移到被調(diào)用函數(shù)的入口。 當(dāng)在一個函數(shù)的運行期間調(diào)用另一個函數(shù)時,在運行該被調(diào)用函數(shù)之前,需先完成三項任務(wù):保存被調(diào)函數(shù)的計算結(jié)果;釋放被調(diào)函數(shù)的數(shù)據(jù)區(qū);依照被調(diào)函數(shù)保存的返回地址將控制轉(zhuǎn)移到調(diào)用函數(shù)。 從被調(diào)用函數(shù)返回調(diào)用函數(shù)之前,應(yīng)該完成下列三項任務(wù):多個函數(shù)嵌套調(diào)用的規(guī)則是:此時的內(nèi)存管理實行
9、“棧式管理”后調(diào)用先返回 !例如:void main( ) void a( ) void b( ) a( ); b( ); /main / a / bMain的數(shù)據(jù)區(qū)函數(shù)a的數(shù)據(jù)區(qū)函數(shù)b的數(shù)據(jù)區(qū)遞歸工作棧:遞歸過程執(zhí)行過程中占用的數(shù)據(jù)區(qū)。遞歸工作記錄:每一層的遞歸參數(shù)合成一個記錄。當(dāng)前活動記錄:棧頂記錄指示當(dāng)前層的執(zhí)行情況。當(dāng)前環(huán)境指針:遞歸工作棧的棧頂指針。 遞歸函數(shù)執(zhí)行的過程可視為同一函數(shù)進(jìn)行嵌套調(diào)用,例如:例1:采用遞歸算法求解正整數(shù)n的階乘(n!) 用C語言編寫出求解n!的遞歸函數(shù)為: long f(int n) if (n = = 0) return 1; else return n
10、 * f(n 1); f(n) = 1 (n=0) nf(n-1) (n0)4r13r24r12r33r24r1進(jìn)行f(4)調(diào)用的系統(tǒng)棧的變化狀態(tài)0r41r42r33r24r11r42r33r24r14r13r24r12r33r24r1進(jìn)行f(4)調(diào)用的系統(tǒng)棧的變化狀態(tài)1r42r33r24r1例2:最大公因子問題 數(shù)學(xué)上利用輾轉(zhuǎn)相除法解決。同時此種方法也稱為歐幾理德定理,其定義為:GCD(M,N) =GCD(N,M % N) (N0)M (N=0)寫出求解最大公因子的遞歸函數(shù)為: long GCD(int M,int N) / 前提條件:MN if (N = = 0) /遞歸結(jié)束條件 retu
11、rn M ; else return GCD(N,M % N); 假設(shè)有三個分別命名為X、Y、Z的塔座,在塔座X上插有n個直徑大小各不相同、依小到大編號為1、2、n的圓盤?,F(xiàn)要求將X軸上的n個圓盤移到塔座Z上并仍按同樣的順序疊排,圓盤移動時必須遵循下列規(guī)則: 1)每次只能移動一個圓盤; 2)圓盤可以插在X、Y、Z的任一塔座上; 3)任何時刻都不能將一個較大的圓盤壓在較小的圓盤上。例3:漢諾(hanoi)塔問題void hanoi (int n, char x, char y, char z)/ 將塔座x上按直徑由小到大且至上而下編號為1至n/ 的n個圓盤按規(guī)則搬到塔座z上,y可用作輔助塔座。1
12、 2 if (n=1)3 move(x, 1, z); / 將編號為的圓盤從x移到z4 else 5 hanoi(n-1, x, z, y); / 將x上編號為至n-1的 /圓盤移到y(tǒng), z作輔助塔6 move(x, n, z); / 將編號為n的圓盤從x移到z7 hanoi(n-1, y, x, z); / 將y上編號為至n-1的 /圓盤移到z, x作輔助塔8 9 遞歸工作棧狀態(tài)(返址,n值,x值,y值,z值)塔與圓盤的狀態(tài)0, 3, a, b, cabc主函數(shù): 執(zhí)行調(diào)用語句hanoi (3,a,b,c) ,入棧。層1: 執(zhí)行1,2,4,5語句,產(chǎn)生向下調(diào)用,進(jìn)層2。遞歸工作棧狀態(tài)(返址,
13、n值,x值,y值,z值)塔與圓盤的狀態(tài)0, 3, a, b, cabc6, 2, a, c, b層2 入棧,記錄層1的返回地址6等信息; 執(zhí)行2層的1,2,4,5語句,執(zhí)行到語句再向下調(diào)用,進(jìn)入層3。遞歸工作棧狀態(tài)(返址,n值,x值,y值,z值)塔與圓盤的狀態(tài)0, 3, a, b, cabc6, 2, a, c, b6, 1, a, b, c層3 入棧,記錄層2的返回地址6等信息; 執(zhí)行1,2,3,9語句,過程執(zhí)行完。層 第層調(diào)用結(jié)束,出棧,返回第2層; 從第2層的斷點語句執(zhí)行; 執(zhí)行到語句,又開始向下遞歸調(diào)用到第3層。遞歸工作棧狀態(tài)(返址,n值,x值,y值,z值)塔與圓盤的狀態(tài)0, 3, a
14、, b, cabc6, 2, a, c, b6, 1, a, b, c層3 入棧,記錄層2的返回地址8等信息; 執(zhí)行語句1,2,3,9,過程執(zhí)行完。 出棧,返回第2層斷點語句8。遞歸工作棧狀態(tài)(返址,n值,x值,y值,z值)塔與圓盤的狀態(tài)0, 3, a, b, cabc6, 2, a, c, b8, 1, c, a, b層 從第3層返回后,從斷點開始執(zhí)行,執(zhí)行語句8,9,過程執(zhí)行完,出棧,返回第1層。層 從第2層返回后,從斷點開始執(zhí)行;執(zhí)行到語句,又開始向下遞歸調(diào)用到層2,入棧,記錄第1層的返回地址8等信息。遞歸工作棧狀態(tài)(返址,n值,x值,y值,z值)塔與圓盤的狀態(tài)0, 3, a, b, cabc6, 2, a, c, b8, 2, b, a, c層 執(zhí)行到語句,向下遞歸調(diào)用。層 執(zhí)行語句,2,3,9,結(jié)束,返回第2層。遞歸工作棧狀態(tài)(返址,n值,x值,y值,z值)塔與圓盤的狀態(tài)0, 3, a, b, cabc8, 2, b, a, c6, 1, b, c, a層 從斷點語句6開始執(zhí)行,執(zhí)行到語句7,向下遞歸調(diào)用,到層
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出國留學(xué)銷售代表銷售總結(jié)報告
- 二零二五版牙科診所綠色環(huán)保材料使用協(xié)議3篇
- 二零二五年度公租房買賣合同模板及注意事項3篇
- 二零二五年度新能源項目居間合作協(xié)議4篇
- 二零二五年度個人商鋪買賣合同示范4篇
- 2025版贖樓擔(dān)保與房地產(chǎn)抵押貸款合同6篇
- 2025版物業(yè)管理公司人力資源外包合作協(xié)議書范本3篇
- 二零二五年度移動支付解決方案個人定制開發(fā)合同4篇
- 二零二五年度高空作業(yè)施工圍板租賃與安裝服務(wù)合同2篇
- 二零二五年度紀(jì)錄片攝影師制作合同2篇
- 電信網(wǎng)和互聯(lián)網(wǎng)圖像篡改檢測技術(shù)要求與測試方法
- 軌道工程-第三章-有砟軌道
- 2025屆江蘇省南京市鹽城市高三一模考試語文試題 課件
- 《水稻生長進(jìn)程》課件
- 2024版企業(yè)高管職務(wù)任命書3篇
- 青少年鑄牢中華民族共同體意識路徑研究
- 泌尿:膀胱腫瘤病人的護(hù)理查房王雪-課件
- 學(xué)校農(nóng)業(yè)教育體驗項目方案
- 標(biāo)點符號的研究報告
- 《城南舊事》惠安館--解讀
- 2022年貴州省貴陽市中考英語試題及參考答案
評論
0/150
提交評論