中缀表达式转后缀、前缀表达式的方法
舉一個(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件系统之FHS
- 下一篇: 源创媒:360百科词条个人如何创建