數(shù)學表達式解析前綴、中綴、后綴_第1頁
數(shù)學表達式解析前綴、中綴、后綴_第2頁
數(shù)學表達式解析前綴、中綴、后綴_第3頁
數(shù)學表達式解析前綴、中綴、后綴_第4頁
數(shù)學表達式解析前綴、中綴、后綴_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、前綴、中綴、后綴表達式它們都是對表達式的記法,因此也被稱為前綴記法、中綴記法和后綴記法。它們之間的區(qū)別在于運算符相對與操作數(shù)的位置不同:前綴表達式的運算符位于與其相關的操作數(shù)之前;中綴和后綴同理。舉例:(3+4)樂-6就是中綴表達式-+3456前綴表達式34+56-后綴表達式中綴表達式(中綴記法)中綴表達式是一種通用的算術或邏輯公式表示方法,操作符以中綴形式處于操作數(shù)的中間。中綴表達式是人們常用的算術表示方法。雖然人的大腦很容易理解與分析中綴表達式,但對計算機來說中綴表達式卻是很復雜的,因此計算表達式的值時,通常需要先將中綴表達式轉換為前綴或后綴表達式,然后再進行求值。對計算機來說,計算前綴或

2、后綴表達式的值非常簡單。前綴表達式(前綴記法、波蘭式)前綴表達式的運算符位于操作數(shù)之前。前綴表達式的計算機求值:從右至左掃描表達式,遇到數(shù)字時,將數(shù)字壓入堆棧,遇到運算符時,彈出棧頂?shù)膬蓚€數(shù),用運算符對它們做相應的計算(棧頂元素op次頂元素),并將結果入棧;重復上述過程直到表達式最左端,最后運算得出的值即為表達式的結果。例如前綴表達式-X+3456:”(1)從右至左掃描,將6、5、4、3壓入堆棧;(2)遇到+運算符,因此彈出3和4(3為棧頂元素,4為次頂元素,注意與后綴表達式做比較),計算出3+4的值,得7,再將7入棧;(3)接下來是X運算符,因此彈出7和5,計算出7X5=35,將35入棧;(

3、4)最后是-運算符,計算出35-6的值,即29,由此得出最終結果??梢钥闯?,用計算機計算前綴表達式的值是很容易的。將中綴表達式轉換為前綴表達式:遵循以下步驟:(1)初始化兩個棧:運算符棧S1和儲存中間結果的棧S2;(2)從右至左掃描中綴表達式;(3)遇到操作數(shù)時,將其壓入S2;(4)遇到運算符時,比較其與S1棧頂運算符的優(yōu)先級:(4-1)如果S1為空,或棧頂運算符為右括號“則直接將此運算符入棧;(4-2)否則,若優(yōu)先級比棧頂運算符的較高或相等,也將運算符壓入S1;(4-3)否則,將S1棧頂?shù)倪\算符彈出并壓入到S2中,再次車t到(4-1)與S1中新的棧頂運算符相比較;(5)遇到括號時:(5-1)

4、如果是右括號“)”則直接壓入S1;(5-2)如果是左括號“(”則依次彈出S1棧頂?shù)倪\算符,并壓入S2,直到遇到右括號為止,此時將這一對括號丟棄;(6)重復步驟(2)至(5),直到表達式的最左邊;(7)將S1中剩余的運算符依次彈出并壓入S2;(8)依次弓t出S2中的元素并輸出,結果即為中綴表達式對應的前綴表達式。例如,將中綴表達式“1+(2+3)X45”轉換為前綴表達式的過程如下:掃描到的元素S2(棧底-棧頂)S1(棧底-棧頂)說明55空數(shù)字,直接入棧-5-S1為空,運算符直接入棧)5-)右括號直接入棧454-)數(shù)字直接入棧X54-)XS1棧頂是右括號,直接入棧)54-)X)右括號直接入棧r35

5、43-)X)數(shù)字1+543-)X)+S1棧頂是右括號,直接入棧II25432-)X)+數(shù)字(5432+-)X左括號,彈出運算符直至遇到右括號(5432+X-同上+5432+X-+優(yōu)先級與-相同,入棧15432+X1-+數(shù)字到達最左端5432+X1+-空S1中剩余的運算符因此結果為-+1X+2345。后綴表達式(后綴記法、逆波蘭式)后綴表達式與前綴表達式類似,只是運算符位于操作數(shù)之后。后綴表達式的計算機求值:與前綴表達式類似,只是順序是從左至右:從左至右掃描表達式,遇到數(shù)字時,將數(shù)字壓入堆棧,遇到運算符時,彈出棧頂?shù)膬蓚€數(shù),用運算符對它們做相應的計算(次頂元素op棧頂元素),并將結果入棧;重復上

6、述過程直到表達式最右端,最后運算得出的值即為表達式的結果。例如后綴表達式“34+5X-”6(1)從左至右掃描,將3和4壓入堆棧;(2)遇到+運算符,因此彈出4和3(4為棧頂元素,3為次頂元素,注意與前綴表達式做比較),計算出3+4的值,得7,再將7入棧;(3)將5入棧;(4)接下來是滋算符,因此彈出5和7,計算出7X5=35,將35入棧;(5)將6人棧;(6)最后是-運算符,計算出35-6的值,即29,由此得出最終結果。將中綴表達式轉換為后綴表達式:與轉換為前綴表達式相似,遵循以下步驟:(1)初始化兩個棧:運算符棧S1和儲存中間結果的棧S2;(2)從左至右掃描中綴表達式;(3)遇到操作數(shù)時,將

7、其壓入S2;(4)遇到運算符時,比較其與S1棧頂運算符的優(yōu)先級:(4-1)如果S1為空,或棧頂運算符為左括號“(”則直接將此運算符入棧;(4-2)否則,若優(yōu)先級比棧頂運算符的高,也將運算符壓入S1(注意轉換為前綴表達式時是優(yōu)先級較高或相同,而這里則不包括相同的情況);(4-3)否則,將S1棧頂?shù)倪\算符彈出并壓入到S2中,再次車t到(4-1)與S1中新的棧頂運算符相比較;(5)遇到括號時:(5-1)如果是左括號則直接壓入S1;(5-2)如果是右括號則依次彈出S1棧頂?shù)倪\算符,并壓入S2,直到遇到左括號為止,此時將這一對括號丟棄;(6)重復步驟(2)至(5),直到表達式的最右邊;(7)將S1中剩余

8、的運算符依次彈出并壓入S2;(8)依次弓t出S2中的元素并輸出,結果的逆序即為中綴表達式對應的后綴表達式(轉換為前綴表達式時不用逆序)。例如,將中綴表達式“1+(2+3)X置”轉換為后綴表達式的過程如下:掃描到的元素S2(棧底-棧頂)S1(棧底-棧頂)說明11空數(shù)字,直接入棧+11+S1為空,運算符直接入棧1(1+(左括號,直接入棧(1+(同上12112+(數(shù)字1+112+(+S1棧頂為左括號,運算符直接入棧3123+(+數(shù)字)123+(右括號,彈出運算符直至遇到左括號X123+(XS1棧頂為左括號,運算符直接入棧4123+4+(X數(shù)字)123+4X+右括號,彈出運算符直至遇到左括號-123+

9、4X+-與+優(yōu)先級相同,因此彈出+,再壓入-5123+4X+5-數(shù)字到達最右端123+4X+5-空S1中剩余的運算符因此結果為“123+4X+為(注意需要逆序輸出)。編寫Java程序將一個中綴表達式轉換為前綴表達式和后綴表達式,并計算表達式的值。其中的toPolishNotation()方法將中綴表達式轉換為前綴表達式(波蘭式)、toReversePolishNotation()方法則用于將中綴表達式轉換為后綴表達式(逆波蘭式):注:(1)程序很長且注釋比較少,但如果將上面的理論內容弄懂之后再將程序編譯并運行起來,還是比較容易理解的。有耐心的話可以研究一下。(2)此程序是筆者為了說明上述概念而

10、編寫,僅做了簡單的測試,不保證其中沒有Bug,因此不要將其用于除研究之外的其他場合。javaviewplaincopy1.packageqmk.simple_test;2.importjava.util.Scanner;3.importjava.util.Stack;4./*5.*Exampleofconvertinganinfix-expressionto6.*PolishNotation(PN)orReversePolishNotation(RPN).7.*Writtenin2011-8-258.*authorQiaoMingkui9.*/staticfinalStringUSAGE=us

11、age=ninputtheexpressions,andthentheprogramwillcalculatethemandshowtheresult.ninputbyetoexit.n;10.publicclass11.public12.+13.+14.+15./*5.26.27.*paramargs*/publicstaticvoidmain(String口args)System.out.println(USAGE);Scannerscanner=newScanner(System.in);Stringinput=;finalStri

12、ngCLOSE_MARK=bye;System.out.println(inputanexpression:);input=scanner.nextLine();while(input.length()!=0&!CLOSE_MARK.equals(input)System.out.print(PolishNotation(PN):) ;Calculator28.try(29.toPolishNotation(input);30.catch(NumberFormatExceptione)31.System.out.println(ninputerror,notanumber.);32.c

13、atch(IllegalArgumentExceptione)33.System.out.println(ninputerror:etMessage();34.catch(Exceptione)35.System.out.println(ninputerror,invalidexpression.);36.37.System.out.print(ReversePolishNotation(RPN)38.);try39.toReversePolishNotation(input);40.catch(NumberFormatExceptione)41.System.out.println(ninp

14、uterror,notanumber.);42.catch(IllegalArgumentExceptione)43.System.out.println(ninputerror:etMessage();44.catch(Exceptione)45.System.out.println(ninputerror,invalidexpression.);46.47.System.out.println(inputanewexpression:48.input=scanner.nextLine();49.50.System.out.println(programexits);51.52./*53.*

15、parsetheexpression,andcalculateit.54.*paraminput55.*throwsIllegalArgumentException56.*throwsNumberFormatException57.*/58.privatestaticvoidtoPolishNotation(Stringinput)+e.g+e.g) ;throwsIllegalArgumentException,NumberFormatException71.number=Double.parseDouble(input.substring(lastIndex,i+1);72.s2.push

16、(number);73.i=lastIndex;74.if(int)number=number)75.expression.push(int)number);76.else77.expression.push(number);78.elseif(isOperator(c)79.while(!s1.isEmpty()80.&s1.peek()!=)81.&priorityCompare(c,s1.peek()0)82.expression.push(s1.peek();83.s2.push(calc(s2.pop(),s2.pop(),s1.pop();84.85.s1.push

17、(c);86.elseif(c=)87.s1.push(c);88.elseif(c=()89.while(tempChar=s1.pop()!=)90.expression.push(tempChar);91.s2.push(calc(s2.pop(),s2.pop(),tempChar);8.69.70.intlen=input.length();charc,tempChar;Stacks1=Stacks2=Stackexpression=doublenumber;intlastIndex=-1;newStack();newStack

18、();newStack();for(inti=len-1;i=0;-i)c=input.charAt(i);if(Character.isDigit(c)lastIndex=readDoubleReverse(input,i);92.if(s1.isEmpty()93.thrownewIllegalArgumentException(94.bracketdosentmatch,missingrightbracket).);95.96.97.elseif(c=)98./ignore99.else100.thrownewIllegalArgumentException(101.wrongchara

19、cter+c+102.);103.104.while(!s1.isEmpty()105.tempChar=s1.pop();106.expression.push(tempChar);107.s2.push(calc(s2.pop(),s2.pop(),tempChar);108.109.while(!expression.isEmpty()110.System.out.print(expression.pop()+);111.112.doubleresult=s2.pop();113.if(!s2.isEmpty()114.thrownew川egalArgumentException(inp

20、utisawrongexpression.);115.System.out.println();116.if(int)result=result)117.System.out.println(theresultis+(int)result);118.else119.System.out.println(theresultis+result);120.121./*122.*parsetheexpression,andcalculateit.123.*paraminput124.*throwsIllegalArgumentException126.*/127.privatestaticvoidto

21、ReversePolishNotation(Stringinput)128.throwsIllegalArgumentException,NumberFormatElen=input.length();130.charc,tempChar;131.Stacks1=newStack();132.Stacks2=newStack();133.doublenumber;134.intlastIndex=-1;135.for(inti=0;ilen;+i)136.c=input.charAt(i);137.if(Character.isDigit(c)|c=.)138.l

22、astIndex=readDouble(input,i);139.number=Double.parseDouble(input.substring(i,lastIndex);140.s2.push(number);141.i=lastIndex-1;142.if(int)number=number)143.VSystem.out.print(int)number+);144.else145.System.out.print(number+);146.elseif(isOperator(c)147.while(!s1.isEmpty()148.&s1.peek()!=(149.&

23、;priorityCompare(c,s1.peek()=0;-i)243.c=input.charAt(i);244.if(c=.)245.if(dotindex!=-1)246.(thrownewIllegalArgumentException247.therehavemorethan1dots257.258.259./*henumber.);dotindex=i;else250.elseif(!Character.isDigit(c)251.returni+1;252.elseif(i=0)253.return0;254.255.256.thrownewIll

24、egalArgumentException(notanumber.);260.*readthenextnumber261.*paraminput262.*paramstart263.*return264.*throws川egalArgumentException265.*/266.privatestaticintreadDouble(Stringinput,intstart)intlen=input.length();thrownewIllegalArgumentExceptiontherehavemorethan1dotsinthenumber.);thrownewIllegalArgumentExceptionnotanumber,dotcantbethela280.dotIndex=i;291.267.throwsIllegalArgumentEdotIndex=-1;270.charc;271.for(inti=start;i1)284.285.else286.(287.stpartofanumber.);288.elseif(i289.return290.returni;thrownewIllegal

溫馨提示

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

評論

0/150

提交評論