描述
先說明一下什麼是中綴式:
如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.005.53
方法一:
使用棧的結構,從前向後依次掃瞄,當掃瞄到乙個數字時,看棧頂的元素是否是乙個數字,若是數字,則依次彈出兩個元素,進行計算出結果,此時注意不要直接壓棧,要看此時棧頂的元素是否是數字,若是則繼續運算。直到棧頂的元素不是數字,才將計算的結果壓到棧中。
**:#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define maxn 5090
struct node
sta[maxn];
char buf[maxn];
double calc(double a,double b,char c)
int main()
sta[id].dig = val;
sta[id++].oper = 0;
i+=wid-1;
}else
sta[id++].oper = buf[i];
}printf("%.2lf\n",sta[0].dig);
}
return 0;
}方法二:(神用遞迴啊)
string res;
double temp;
sscanf(res.c_str(), "%lf" , &temp); //將string型別的資料轉化成char型別的陣列
**:#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int i;
string str;
double temp;
double ac()
sscanf(res.c_str(), "%lf" , &temp);
return temp;
}if(str[i]=='+')
return ac()+ac();
if(str[i]=='-')
return ac()-ac();
if(str[i]=='*')
return ac()*ac();
if(str[i]=='/')
return ac()/ac();
}int main()
return 0;
}
NYOJ 128 字首式計算
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 先說明一下什麼是中綴式 如2 3 4 5這種我們最常見的式子就是中綴式。而把中綴式按運算順序加上括號就是 2 3 4 5 然後把運算子寫到括號前面就是 2 3 4 5 把括號去掉就是 2 3 4 5 最後這個式子就是該表示式的字...
nyoj128 字首式計算
先說明一下什麼是中綴式 如2 3 4 5這種我們最常見的式子就是中綴式。而把中綴式按運算順序加上括號就是 2 3 4 5 然後把運算子寫到括號前面就是 2 3 4 5 把括號去掉就是 2 3 4 5 最後這個式子就是該表示式的字首表示。給你乙個字首表示式,請你計算出該字首式的值。比如 2 3 4 5...
NYOJ128 字首式計算
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 輸入有多組測試資料,每組測試資料佔一行,任意兩個操作符之間,任意兩個運算元之間,運算元與操作符之間都有乙個空格。輸入的兩個運算元可能是小數,資料保證輸入的數都是正數,並且都小於10,運算元數目不超過500。以eof為輸入結束的標誌。輸...