7-21 求前綴表達式的值 (25分)


算術表達式有前綴表示法、中綴表示法和后綴表示法等形式。前綴表達式指二元運算符位於兩個運算數之前,例如2+3*(7-4)+8/4的前綴表達式是:+ + 2 * 3 - 7 4 / 8 4。請設計程序計算前綴表達式的結果值。

輸入格式:

輸入在一行內給出不超過30個字符的前綴表達式,只包含+-*/以及運算數,不同對象(運算數、運算符號)之間以空格分隔。

輸出格式:

輸出前綴表達式的運算結果,保留小數點后1位,或錯誤信息ERROR

輸入樣例:

+ + 2 * 3 - 7 4 / 8 4
 

輸出樣例:

13.0

排着壓棧,只要有連續的兩個運算數就跟前面的運算符號進行一次運算,s是總棧,標志着當前位置的類型(0符號,1運算數),另外用兩個棧各自存運算數和符號。
代碼:
#include <cstdio>
#include <iostream>
using namespace std;

char s[31],op[30];
double ns[30];
int nc,oc,flag,type[30],c;
int main() {
    while(~scanf("%s",s)) {
        if(flag) continue;
        if(isdigit(s[0]) || s[1]) {
            ns[nc ++] = atof(s);
            type[c ++] = 1;
            while(c > 2 && type[c - 1] && type[c - 2] && !type[c - 3]) {
                double b = ns[-- nc],a = ns[-- nc];
                switch(op[-- oc]) {
                    case '+': ns[nc ++] = a + b;break;
                    case '-': ns[nc ++] = a - b;break;
                    case '*': ns[nc ++] = a * b;break;
                    case '/': if(b == 0.0) flag = 1; else ns[nc ++] = a / b;break;
                }
                c -= 2;
                type[c - 1] = 1;
            }
        }
        else {
            op[oc ++] = s[0];
            type[c ++] = 0;
        }
    }
    if(flag || c != 1 || !type[0]) printf("ERROR");
    else printf("%.1f",ns[0]);
}

 


免責聲明!

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



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