前綴式計算

前綴式計算

時間限制:1000 ms  |  內存限制:65535 KB
難度:3
描述

先說明一下什麼是中綴式:

如2+(3+4)*5這種我們最常見的式子就是中綴式。

而把中綴式按運算順序加上括號就是:(2+((3+4)*5))

然後把運算符寫到括號前面就是+(2 *( +(3 4) 5) )

把括號去掉就是:+ 2 * + 3 4 5

最後這個式子就是該表達式的前綴表示。

給你一個前綴表達式,請你計算出該前綴式的值。

比如:

+ 2 * + 3 4 5的值就是 37

輸入
有多組測試數據,每組測試數據佔一行,任意兩個操作符之間,任意兩個操作數之間,操作數與操作符之間都有一個空格。輸入的兩個操作數可能是小數,數據保證輸入的數都是正數,並且都小於10,操作數數目不超過500。
以EOF爲輸入結束的標誌。
輸出
對每組數據,輸出該前綴表達式的值。輸出結果保留兩位小數。
樣例輸入
+ 2 * + 3 4 5
+ 5.1 / 3 7
樣例輸出
37.00

5.53

個人理解:參考百度答案的


#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define maxn 5000
struct Node {
    double dig;
    char sym;
} sta[maxn];
char buf[maxn];
double cal(double a, double b, char c) {
    if(c == '+') return a + b;
    if(c == '-') return a - b;
    if(c == '*') return a * b;
    return a / b;
}
int main() {
    double val;
    int wid;
    while(gets(buf)) {
        for(int i = 0, id = 0; buf[i] != '\0'; ++i) {
            if(buf[i] == ' ') continue;
            if(isdigit(buf[i]) || buf[i] == '.') {
                sscanf(buf + i, "%lf%n", &val, &wid);
                while(id && !sta[id-1].sym) {
                    val = cal(sta[id-1].dig, val, sta[id-2].sym);
                    id -= 2;
                }
                sta[id].dig = val; sta[id++].sym = 0;
                i = i + wid - 1;
            } else sta[id++].sym = buf[i];
        }
        printf("%.2lf\n", sta[0].dig);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章