前中后綴表達式定義,求值,及其相互轉化


---恢復內容開始---

定義:(直接上例子了)

前綴表達式:

- × + 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、當表達式讀取完成后運算符堆棧中尚有運算符時,則依序取出運算符到操作數堆棧,直到運算符堆棧為空。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM