---恢復內容開始---
定義:(直接上例子了)
前綴表達式:
- × + 3 4 5 6
運算符位於操作數之前。
中綴表達式:
(3 + 4) × 5 - 6
操作符以中綴形式處於操作數的中間。
后綴表達式:
3 4 + 5 × 6 -
運算符位於操作數之后。
表達式求值:
前綴表達式求值:從右至左掃描表達式,遇到數字時,將數字壓入堆棧,遇到運算符時,彈出棧頂的兩個數,用運算符對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧;重復上述過程直到表達式最左端,最后運算得出的值即為表達式的結果。
代碼如下:(前綴表達式之間用逗號分隔)
ps:代碼沒測
double solve(char *str){ stack<dobule>dnum; int len=strlen(str); int cnt=0,idx; bool flag=true; for(int i=len-1;i>=0;i--){ if(str[i]==','||i==0){ if(i!=0) idx=i+1; else idx=i; if(str[idx]=='+'){ if(cnt>=2){ int a=dnum.top();dnum.pop(); int b=dunm.top();dnum.pop(); dnum.push(a+b); }else{ flag=0; break; } }else if(str[idx]=='-'){ if(cnt>=2){ int a=dnum.top();dnum.pop(); int b=dnum.top();dnum.pop(); dnum.push(a-b); }else{ flag=0; break; } }else if(str[idx]=='*'){ if(cnt>=2){ int a=dnum.top();dnum.pop(); int b=dnum.top();dnum.pop(); dnum.push(a*b); }else{ flag=0; break; } }else if(str[idx]=='/'){ if(cnt>=2){ int a=dnum.top();dnum.pop(); int b=dnum.top();dnum.pop(); dnum.push(a/b); }else{ flag=0; break; } }else if(str[idx]>='0'&&str[idx]<='9'){ double sum=0.0; while(str[idx]!=','&&idx<len){ sum=sum*10+str[idx]-'0'; idx++; } dnum.push(sum); cnt++; }else{ flag=0; brak; } } } }
后綴表達式求值:從左到右掃描后綴表達式,若遇操作數,則進棧;若遇運算符,則從棧中退出兩個元素,先退出的放到運算符的右邊,后退出的 放到運算符左邊,運算后的結果再進棧,直到后綴表達式掃描完畢。此時,棧中僅有一個元素,即為運算的結果。代碼類似前綴表達式求值;
中綴表達式求值:轉換成前綴表達式或者后綴表達式后求值
中綴表達式轉前綴表達式:
//首先設定一個操作符棧,從右到左順序掃描整個中綴表達式,如果是操作數,則直接歸入前綴表達式;
//如果是操作符,則檢測器是否是右括號,如果是右括號,則直接將其入棧;
//如果是左括號,則將棧中的操作符依次彈棧,歸入前綴表達式,直至遇到右括號,將右括號彈棧,處理結束;
//如果是其他操作符,則檢測棧頂操作符的優先級與當前操作符的優先級關系,
//如果棧頂操作符優先級大於當前操作符的優先級,則彈棧,並歸入前綴表達式,直至棧頂操作符優先級小於等於當前操作符優先級,這時將當前操作符壓棧。
//當掃描完畢整個中綴表達式后,檢測操作符棧是否為空,如果不為空,則依次將棧中操作符彈棧,歸入前綴表達式。最后,將前綴表達式翻轉,得到中綴表達式對應的前綴表達式。
中綴表達式轉后綴表達式:
//1、從左至右掃描一中綴表達式。
//2、若讀取的是操作數,則判斷該操作數的類型,並將該操作數存入操作數堆棧
//3、若讀取的是運算符
// (1) 該運算符為左括號"(",則直接存入運算符堆棧。
// (2) 該運算符為右括號")",則輸出運算符堆棧中的運算符到操作數堆棧,直到遇到左括號為止。
// (3) 該運算符為非括號運算符:
// (a) 若運算符堆棧棧頂的運算符為括號,則直接存入運算符堆棧。
// (b) 若比運算符堆棧棧頂的運算符優先級高,則直接存入運算符堆棧。
// (c) 若比運算符堆棧棧頂的運算符優先級低或相等,則輸出棧頂運算符到操作數堆棧,並將當前運算符壓入運算符堆棧
//4、當表達式讀取完成后運算符堆棧中尚有運算符時,則依序取出運算符到操作數堆棧,直到運算符堆棧為空。