天天看點

逆波蘭表達式(基本算法之遞歸和自調用函數)

逆波蘭表達式(基本算法之遞歸)

總時間限制: 1000ms 記憶體限制: 65536kB

描述

逆波蘭表達式是一種把運算符前置的算術表達式,例如普通的表達式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表達式的優點是運算符之間不必有優先級關系,也不必用括号改變運算次序,例如(2 + 3) * 4的逆波蘭表示法為* + 2 3 4。本題求解逆波蘭表達式的值,其中運算符包括+ - * /四個。

輸入

輸入為一行,其中運算符和運算數之間都用空格分隔,運算數是浮點數。

輸出

輸出為一行,表達式的值。

可直接用printf(“%f\n”, v)輸出表達式的值v。

樣例輸入

* + 11.0 12.0 + 24.0 35.0

樣例輸出

1357.000000

提示

可使用atof(str)把字元串轉換為一個double類型的浮點數。atof定義在math.h中。

此題可使用函數遞歸調用的方法求解。

關鍵是要能想到不是一次性把一行擷取進去,而是一次擷取一個操作數或操作符,然後按照逆波蘭的規則來計算,遞歸起來就很簡單了。

#include <iostream>
#include<stdio.h>
#include<math.h>
using namespace std; 
//http://noi.openjudge.cn/ch0202/1696/
char a[];
double f(){
    cin>>a;
    switch(a[]){
        case '+':return f()+f();
        case '-':return f()-f();
        case '*':return f()*f();
        case '/':return f()/f();
        default:return atof(a);
    }
}
int main(int argc, char *argv[]) {
    double ans=;
    ans=f();
    printf("%f\n",ans);
    return ;
}
           

繼續閱讀