2021天梯賽訓練-3——7-11 字尾式求值 (25分)
阿新 • • 發佈:2021-01-19
我們人類習慣於書寫“中綴式”,如 3 + 5 * 2 ,其值為13。 (p.s. 為什麼人類習慣中綴式呢?是因為中綴式比字尾式好用麼?)
而計算機更加習慣“字尾式”(也叫“逆波蘭式”,Reverse Polish Notation)。上述中綴式對應的字尾式是: 3 5 2 * +
現在,請對輸入的字尾式進行求值。
輸入格式:
在一行中輸入一個字尾式,運算數和運算子之間用空格分隔,運算數長度不超過6位,運算子僅有+ - * / 四種。
輸出格式:
在一行中輸出字尾式的值,保留一位小數。
輸入樣例:
3 5.4 2.2 * +
輸出樣例:
14.9
思路
這個題沒有說,除數為0或者還有運算子的時候只剩一個數該如如何計算的情況,故不需要考慮。感覺表示式求值比轉換要好做些
最近又發現一個事,
int n=-1;
while(cin>>s[++n]);
這個在devc++裡面是執行不出來的,放在PTA裡面卻可以執行出來
百度了一下
需要輸入ctrl+z結束輸入
windows下ctrl+z
linux下ctrl+d
或者
原理
程式碼
#include<bits/stdc++.h>
using namespace std;
int Judge(string s){
for(int i=0;i< s.size();i++){
if(s.size()==1&&(s[0]=='*'||s[0]=='/'||s[0]=='+'||s[0]=='-')) return 0;
}
return 1;
}
int main(){
stack<double> num;
string s[100000];
int n=-1;
while(cin>>s[++n]);
double x;
for(int i=0;i<n;i++){
if(Judge(s[i])){
x=stod(s[i]);//不是運算子
num.push(x);
}
else{
double a=num.top();num.pop();
double b=num.top();num.pop();
if(s[i]=="*") num.push(a*b);
else if(s[i]=="/") num.push(b/a);
else if(s[i]=="+") num.push(a+b);
else if(s[i]=="-") num.push(b-a);
}
}
cout<<fixed<<setprecision(1)<<num.top()<<endl;
return 0;
}