前綴式計算
- 描述
-
先說明一下什麼是中綴式:
如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; }