版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、堆棧計算機如何進(jìn)行表達(dá)式求值?例 算術(shù)表達(dá)式5+6/2-3*4。正確理解:5+6/2-3*4 = 5+3-3*4 = 8-3*4 = 8-12 = -4由兩類對象的:運算數(shù),如2、3、4運算符號,如+、-、*、/不同運算符號優(yōu)先級不一樣后綴表達(dá)式中綴表達(dá)式:運算符號位于兩個運算數(shù)之間。如 ,a b c d e后綴表達(dá)式:運算符號位于兩個運算數(shù)之后。如, a b c d e 例 6 2 3 4 2 = ?后綴表達(dá)式求值策略:從左向右“掃描”,逐個處理運算數(shù)和運算符號遇到運算數(shù)怎么辦?如何“記住”目前還不未參與運算的數(shù)?遇到運算符號怎么辦?對應(yīng)的運算數(shù)是什么?啟示:需要有種方法,能順序運算數(shù),并在
2、需要時“倒序”輸出!例 6 2 3 4 2 = ?toptop對象: ( 運算符 )對象: 2 (運算數(shù) )toptop對象: (運算符)Pop: 8T( N ) = O ( N )對象: (運算符)對象: 4 (運算數(shù) )對象: ( 運算符 )對象: 3 (運算數(shù) )對象: 6 (運算數(shù) )對象: 2 ( 運算數(shù) )8堆棧的抽象數(shù)據(jù)類型描述堆棧(Stack):具有一定操作約束的線性表只在一端(棧頂,Top)做、刪除數(shù)據(jù):入棧(Push)刪除數(shù)據(jù):出棧(Pop)先出:Last InOut(LIFO)堆棧的抽象數(shù)據(jù)類型描述類型名稱: 堆棧(Stack)數(shù)據(jù)對象集:一個有0個或多個元素的有窮線性表
3、。操作集:長度為MaxSize的堆棧S Stack,堆棧元素item ElementType 1、Stack CreateStack(MaxSize ): 生成空堆棧,其最大長度為MaxSize;MaxSize ):判斷堆棧S是否已滿;2、IsFull( Stack S,3、void Push( Stack S, ElementType item ):將元素item壓入堆棧;4、IsEmpty ( Stack S ):判斷堆棧S是否為空;5、ElementType Pop( Stack S ):刪除并返回棧頂元素;ABCDCreatStack( );Push(S,A);Push(S,B);Pu
4、sh(S,C);ADCB x=Pop(S);x=Pop(S);x=Pop(S);IsEmpty (S)TopTopTopTopABAC BATopTopTopTop5435261C BAB AAPush 和 Pop 可以穿插交替進(jìn)行;按照操作系列Push(S,A), Push(S,B),Push(S,C),Pop(S),Pop(S),Pop(S)堆棧輸出是?CBA而Push(S,A), Pop(S),Push(S,B),Push(S,C),Pop(S),Pop(S)堆棧輸出是?ACB例 如果三個字符按ABC順序壓入堆棧ABC的所有排列都可能是出棧的序列嗎?可以產(chǎn)生CAB這樣的序列嗎?棧的順序?qū)?/p>
5、現(xiàn)棧的順序結(jié)構(gòu)通常由一個一維數(shù)組和一個棧頂元素位置的變量組成。#define MaxSize ElementType DataMaxSize; Top;(1)入棧 Stack; B PtrSTopAvoid Push( Stack *PtrS, ElementType item )if ( PtrS-Top = MaxSize-1 ) prf(“堆棧滿”); return;else PtrS-Data+(PtrS-Top) = item; return;(2)出棧TopPtrSBAElementType Pop( Stack *PtrS )if ( PtrS-Top = -1 ) prf(“堆
6、??铡?;return ERROR;/* ERROR是ElementType的特殊值,標(biāo)志錯誤*/ elsereturn ( PtrS-Data(PtrS-Top)- );例 請用一個數(shù)組實現(xiàn)兩個堆棧,要求最大地利用數(shù)組空間,使數(shù)組只要有空間入棧操作就可以成功。【分析】 一種比較聰明的方法是使這兩個棧分別從數(shù)組的兩頭開始向中間生長;當(dāng)兩個棧的棧頂指針相遇時,表示兩個棧都滿了。#define MaxSize ElementType DataMaxSize;Top1;Top2;/* 堆棧的棧頂指針 */* 堆棧的棧頂指針 */ S;S.Top1 = -1;S.Top2 = MaxSize;Elem
7、entType Pop( struct DStack *PtrS,Tag ) /* Tag作為區(qū)分兩個堆棧的標(biāo)志,取值為1和2 */if ( Tag = 1 ) /* 對第一個堆棧操作 */if ( PtrS-Top1 = -1 ) /*堆棧1空 */prf(“堆棧1空”);return NULL; else return PtrS-Data(PtrS-Top1)-; else /* 對第二個堆棧操作 */if ( PtrS-Top2 = MaxSize ) /*堆棧2空 */prf(“堆棧2空”); return NULL; else return PtrS-Data(PtrS-Top2)+
8、;void Push( struct DStack *PtrS, ElementType item,Tag ) /* Tag作為區(qū)分兩個堆棧的標(biāo)志,取值為1和2 */if ( PtrS-Top2 PtrS-Top1 = 1) /*堆棧滿*/prf(“堆棧滿”);return ;if ( Tag = 1 ) /* 對第一個堆棧操作 */PtrS-Data+(PtrS-Top1) = item; else/* 對第二個堆棧操作 */ PtrS-Data-(PtrS-Top2) = item;堆棧的鏈?zhǔn)綄崿F(xiàn)棧的鏈?zhǔn)浇Y(jié)構(gòu)實際上就是一個單鏈表,叫做鏈棧。和刪除操作只能在鏈棧的棧頂進(jìn)行。棧頂指針Top應(yīng)該
9、在鏈表的哪一頭?typedef struct NodeElementType Data;struct Node *Next; LinkStack; LinkStack *Top;堆棧初始化(建立空棧)判斷堆棧S是否為空SLinkStack *CreateStack() /* 構(gòu)建一個堆棧的頭結(jié)點,返回指針 */ LinkStack *S;S = malloc( sizeof(struct Node ); S-Next = NULL;return S;IsEmpty( LinkStack *S )/*判斷堆棧S是否為空,若為空函數(shù)返回整數(shù) 1,否則返回0 */return ( S-Next =
10、NULL );12/23ElementType Pop( LinkStack *S ) /* 刪除并返回堆棧S的棧頂元素 */ struct Node *Cell; ElementType TopElem;if( IsEmpty( S ) ) prf(“堆??铡?; return NULL; else Cell = S-Next;S-Next =Cell-Next; TopElem =Cell -Element; free(Cell);return TopElem;void Push( ElementType item, LinkStack *S ) /* 將元素item壓入堆棧S */ st
11、ruct Node *TmpCell;TmpCell = malloc( sizeof( struct Node ) );TmpCell-Element = item; TmpCell-Next = S-Next; S-Next = TmpCell;堆棧應(yīng)用:表達(dá)式求值回憶:應(yīng)用堆棧實現(xiàn)后綴表達(dá)式求值的基本過程:從左到右讀入后綴表達(dá)式的各項(運算符或運算數(shù));對象分割求值字符序列的后綴表達(dá)式對象序列的后綴表達(dá)式結(jié)果值GetOp利用堆棧1.2 1.3 + 2 4.2 * -1.2 1.3 + 2 4.2 *-5.9運算數(shù):入棧;運算符:從堆棧出適當(dāng)數(shù)量的運算數(shù),計算并結(jié)果入棧;最后,堆棧頂上的元
12、素就是表達(dá)式的結(jié)果值。中綴表達(dá)式求值基本策略:將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式,然后求值如何將中綴表達(dá)式轉(zhuǎn)換為后綴?觀察一個簡單例子: 2+9/3-5運算數(shù)相對順序不變運算符號順序發(fā)生改變2 9 3 / + 5 -堆棧!需要“等待中”的運算符號要將當(dāng)前運算符號與“等待中”的最后一個運算符號比較有括號怎么辦?例 a ( b c ) d =?cd輸出:abtopT( N ) = O ( N )16/23輸入對象: a (操作數(shù))輸入對象: (乘法)輸入對象: ( (左括號)輸入對象: b (操作數(shù))輸入對象: (加法)輸入對象: c (操作數(shù))輸入對象: ) (右括號)輸入對象: (除法)輸入對象:
13、d (操作數(shù))a b c d 中綴表達(dá)式求值對象分割字符序列的中綴表達(dá)式對象序列的中綴表達(dá)式GetOp利用堆棧轉(zhuǎn)換求值對象序列的后綴表達(dá)式結(jié)果值利用堆棧對象分割(1.2 +1.3 2) * 4.2(1.2 +1.3 2)*4.2GetOp利用堆棧轉(zhuǎn)換求值2.11.2 1.3 + 2 - 4.2*利用堆棧中綴表達(dá)式如何轉(zhuǎn)換為后綴表達(dá)式從頭到尾中綴表達(dá)式的每個對象,對不同對象按不同的情況處理。 運算數(shù):直接輸出; 左括號:壓入堆棧; 右括號:將棧頂?shù)倪\算符彈出并輸出,直到遇到左括號(出棧,不輸出); 運算符:若優(yōu)先級大于棧頂運算符時,則把它壓棧;若優(yōu)先級小于等于棧頂運算符時,將棧頂運算符彈出并輸出;再比較新的棧頂運算符,直到該運算符大于棧頂運算符優(yōu)先級為止,然后將該運算符壓棧; 若各對象處理完畢,則把堆棧中存留的運算符一并輸出。中綴轉(zhuǎn)換為后綴示例: ( 2*(9+6/3-5)+4)步驟待處理表達(dá)式堆棧狀態(tài)(底頂)輸出狀態(tài)12*(9+6/3-5)+42*(9+6/3-5)+423(9+6/3-5)+4*249+6/3-5)+4*(25+6/3-5)+4*(2 966/3-5)+4*(
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報參考:金銀繡藝術(shù)特征及其傳承創(chuàng)新研究
- 二零二五版能源設(shè)施安全防護(hù)勞務(wù)分包協(xié)議3篇
- 二零二五版房地產(chǎn)開發(fā)經(jīng)營項目環(huán)境保護(hù)合同范本3篇
- 2025年常州貨運資格證在哪里練題
- 二零二五版毛竹砍伐與林業(yè)碳交易市場接入合同4篇
- 2025年光伏發(fā)電項目投資合作合同模板4篇
- 二零二五年度出租車公司車輛融資租賃合同5篇
- 二零二五年度農(nóng)產(chǎn)品電商平臺合作協(xié)議6篇
- 2025年度智能倉儲物流系統(tǒng)承包經(jīng)營協(xié)議書4篇
- 二零二五年度企業(yè)信用擔(dān)保合同模板:降低融資風(fēng)險2篇
- 課題申報書:GenAI賦能新質(zhì)人才培養(yǎng)的生成式學(xué)習(xí)設(shè)計研究
- 駱駝祥子-(一)-劇本
- 全國醫(yī)院數(shù)量統(tǒng)計
- 《中國香文化》課件
- 2024年醫(yī)美行業(yè)社媒平臺人群趨勢洞察報告-醫(yī)美行業(yè)觀察星秀傳媒
- 第六次全國幽門螺桿菌感染處理共識報告-
- 天津市2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 經(jīng)濟(jì)學(xué)的思維方式(第13版)
- 盤錦市重點中學(xué)2024年中考英語全真模擬試卷含答案
- 手衛(wèi)生依從性調(diào)查表
- 湖北教育出版社四年級下冊信息技術(shù)教案
評論
0/150
提交評論