日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中缀表达式转后缀、前缀表达式的方法

發(fā)布時(shí)間:2024/1/1 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中缀表达式转后缀、前缀表达式的方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

舉一個(gè)中綴表達(dá)式的例子:a+b-a*((c+d)/e-f)+g

一、中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

方法一:括號(hào)法

比較簡單方便。

①按照運(yùn)算符的優(yōu)先級(jí),對(duì)所有的運(yùn)算單位加括號(hào)。

于是變成:(((a+b)-(a*(((c+d)/e)-f)))+g)

②從最里面的括號(hào)開始,依次把運(yùn)算符號(hào)移動(dòng)到對(duì)應(yīng)的括號(hào)的后面

于是變成:(((ab)+(a(((cd)+e)/f)-)*)-g)+

③最后,把括號(hào)都去掉

于是變成:ab+acd+e/f-*-g+

?

方法二:利用語法樹

略。

?

方法三:基于堆棧的算法

具體轉(zhuǎn)換方式:

從左到右進(jìn)行遍歷。

1.遇到的是運(yùn)算數(shù),直接輸出。

2.遇到的是左括號(hào)'(',直接壓入堆棧(括號(hào)是最高優(yōu)先級(jí),無需比較;入棧后優(yōu)先級(jí)降到最低,確保其他符號(hào)正常入棧)。

3.遇到的是右括號(hào)')',意味著括號(hào)已結(jié)束。不斷彈出棧頂運(yùn)算符并輸出,直到遇到左括號(hào),這個(gè)左括號(hào)彈出但是不輸出。

4.遇到的是運(yùn)算符('+'、'-'、'*'、'/'),有三種情況

①如果棧為空,直接入棧。

②如果棧頂元素是左括號(hào)'(',直接入棧。

③如果棧頂元素是運(yùn)算符,則需要進(jìn)行比較,

1-如果優(yōu)先級(jí)大于棧頂運(yùn)算符,則壓入堆棧;

2-如果優(yōu)先級(jí)小于等于棧頂運(yùn)算符,則將棧頂運(yùn)算符彈出并輸出,然后比較新的棧頂運(yùn)算符,直到優(yōu)先級(jí)大于棧頂運(yùn)算符或者棧空,再將該運(yùn)算符入棧

5.如果對(duì)象處理完畢,則按順序彈出并輸出棧中所有運(yùn)算符

算法如下:

/* 中綴轉(zhuǎn)后綴 思路: 中綴存于一個(gè)字符數(shù)組infix[]里,有一個(gè)輔助棧s1,棧頂元素為top1,有一個(gè)結(jié)果棧s2,棧頂元素為top2。 從左向右掃描。i=0,當(dāng)infix[i]!='\0'時(shí), 1、碰到'0'-'9',存入s2中。 2、碰到'(',存入s1中。 3、碰到'+'、'-'、'*'、'/',如果棧為空,或者top1='(',或者運(yùn)算符的優(yōu)先級(jí)大于top1棧頂元素的優(yōu)先級(jí),存入s1中;否則s2[++top2]=s1[top1--]。 4、碰到')',將s1里截止到'('以前的元素全部放到s2中,并把'('丟掉 *///判斷運(yùn)算符的優(yōu)先級(jí) int getPriority(char op){if(op=='+'||op=='-')return 0; //+或-的優(yōu)先級(jí)比較低elsereturn 1; }void infixToPostFix(char infix[], char s2[], int &top2) //infix[]是中綴表達(dá)式存在數(shù)組里,s2是結(jié)果棧 {char s1[maxSize]; int top1=-1; //s1是輔助棧int i=0;while(infix[i]!='\0'){if('0'<=infix[i]&&infix[i]<='9'){ //如果掃描到'0'-'9'字符,將它放入s2s2[++top2]==infix[i];++i;}else if(infix[i]=='('){ //如果掃描到'(',將它放入s1s1[++top1]='(';++i;}else if(infix[i]=='+'|| //如果掃描到'+','-','*','/'字符,需要和s1里的元素進(jìn)行判斷infix[i]=='-'||infix[i]=='*'||infix[i]=='/'){if(top1==-1|| //判斷s1是否為空s1[top1]=='('|| //判斷輔助棧的棧頂元素是否為'('getPriority(infix[i])>getPriority(top1[top1])){ //判斷表達(dá)式里元素的優(yōu)先級(jí)是否大于s1元素的優(yōu)先級(jí)s1[++top1]=infix[i];++i;}else //如果不是,將輔助站的運(yùn)算符放入結(jié)果棧里s2[++top2]==s1[top1--];}else if(infix[i]==')'){while(s1[top1]!='(')s2[++top2]=s1[top1--];--top1; //刪除s1里的'('++i;}}while(top1!=-1)s2[++top2]=s1[top1--]; //將s1中的元素都放入s2 }

?

二、中綴表達(dá)式轉(zhuǎn)前綴表達(dá)式

和中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式類似,稍微有點(diǎn)區(qū)別。

方法一:括號(hào)法

比較簡單方便。

①按照運(yùn)算符的優(yōu)先級(jí),對(duì)所有的運(yùn)算單位加括號(hào)。

于是變成:(((a+b)-(a*(((c+d)/e)-f)))+g)

②從最里面的括號(hào)開始,依次把運(yùn)算符號(hào)移動(dòng)到對(duì)應(yīng)的括號(hào)的前面

于是變成:+(-(+(ab)*(a-(/(+(cd)e)f)))g)

③最后,把括號(hào)都去掉

于是變成:+-+ab*a-/+cdefg

?

方法二:利用語法樹

略。

?

方法三:基于堆棧的算法

具體轉(zhuǎn)換方式:

從右到左進(jìn)行遍歷。

1.遇到的是運(yùn)算數(shù),直接輸出。

2.遇到的是右括號(hào)')',直接壓入堆棧(括號(hào)是最高優(yōu)先級(jí),無需比較;入棧后優(yōu)先級(jí)降到最低,確保其他符號(hào)正常入棧)。

3.遇到的是左括號(hào)'(',意味著括號(hào)已結(jié)束。不斷彈出棧頂運(yùn)算符并輸出,直到遇到右括號(hào),這個(gè)右括號(hào)彈出但是不輸出。

4.遇到的是運(yùn)算符('+'、'-'、'*'、'/'),有三種情況

①如果棧為空,直接入棧。

②如果棧頂元素是右括號(hào)')',直接入棧。

③如果棧頂元素是運(yùn)算符,則需要進(jìn)行比較,

1-如果優(yōu)先級(jí)大于等于棧頂運(yùn)算符,則壓入堆棧;

2-如果優(yōu)先級(jí)小于棧頂運(yùn)算符,則將棧頂運(yùn)算符彈出并輸出,然后比較新的棧頂運(yùn)算符,直到優(yōu)先級(jí)大于等于棧頂運(yùn)算符或者棧空,再將該運(yùn)算符入棧

5.如果對(duì)象處理完畢,則按順序彈出并輸出棧中所有運(yùn)算符

算法如下:

/* 中綴轉(zhuǎn)前綴 思路: 中綴存于一個(gè)字符數(shù)組infix[]里,有一個(gè)輔助棧s1,棧頂元素為top1,有一個(gè)結(jié)果棧s2,棧頂元素為top2。 從右向左掃描。i=len-1,當(dāng)i>=0時(shí), 1、碰到'0'-'9',存入s2中。 2、碰到')',存入s1中。 3、碰到'+'、'-'、'*'、'/',如果棧為空,或者top1=')',運(yùn)算符的優(yōu)先級(jí)大于等于top1棧頂元素的優(yōu)先級(jí),存入s1中;否則s2[++top2]=s1[top1--]。 4、碰到'(',將s1里截止到')'以前的元素全部放到s2中,并把')'丟掉 *///判斷運(yùn)算符的優(yōu)先級(jí) int getPriority(char op){if(op=='+'||op=='-')return 0; //+或-的優(yōu)先級(jí)比較低elsereturn 1; }void infixToPreFix(char infix[], int len, char s2[], int top2){char s1[maxSize]; int top1=-1;int i=len-1;while(i>=0){if('0'<=infix[i]&&infix[i]<='9'){s2[++top2]=infix[i];--i;}else if(infix[i]==')'){s1[++top1]=')';--i;}else if(infix[i]=='+'||infix[i]=='-'||infix[i]=='*'||infix[i]=='/'){if(top1==-1||s1[top1]==')'||getPriority(infix[i])>=getPriority(s1[top1])){s1[++top1]=infix[i];--i;}else s2[++top2]=s1[top1--];}if(infix[i]=='('){while(s1[top1]!=')')s2[++top2]=s1[top1--];--top1;--i;}}while(top1!=-1)s2[++top2]=s1[top1--]; }

總結(jié)

以上是生活随笔為你收集整理的中缀表达式转后缀、前缀表达式的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。