題目: 逆波蘭表達式是一種把運算符前置的算術表達式,例如普通的表達式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表達式的優點是 運算符之間不必有優先順序關係,也不必用括弧改變運算次序,例如(2 + 3) * 4的逆波蘭表示法為* + 2 3 4。本題求解逆波蘭 表達式的值,其中運算符包括+ - * / ...
題目:
逆波蘭表達式是一種把運算符前置的算術表達式,例如普通的表達式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
這裡先列一個網站,是波蘭表達式的維基百科,讓讀者弄明白什麼是波蘭表達式,即首碼表達式。題目中的逆波蘭表達式實際上
是錯誤的。
https://zh.wikipedia.org/wiki/%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95
對於波蘭表達式的運算順序,我覺得這張圖看懂的話,就不會再有任何的問題。
- * / 15 - 7 + 1 1 3 + 2 + 1 1 =
- * / 15 - 7 2 3 + 2 + 1 1 =
- * / 15 5 3 + 2 + 1 1 =
- * 3 3 + 2 + 1 1 =
- 9 + 2 + 1 1 =
- 9 + 2 2 =
- 9 4 =
5
關於這道題目的思想就是棧的思想,還有就是遞歸的思路。
#include <bits/stdc++.h>
using namespace std;
char s[1005];
double f() {
scanf("%s",s);
switch(s[0]){
case '+':return f()+f();
case '-':return f()-f();
case '*':return f()*f();
case '/':return f()/f();
default:return atof(s);
}
}
int main(){
printf("%f",f());
return 0;
}
這種解法我覺得是比較高級的解法,核心思想就是每次都從字元串中讀入一個字元,然後通過switch語句選擇分路,這個函數唯一
的出口就是兩個讀入的數值都是常數值,而不是加減乘除,然後就得到一個結果,結合之前波蘭表達式的用法和遞歸的思路就很方
便解決這個問題。