1. 程式人生 > 其它 >2021天梯賽訓練-3——7-11 字尾式求值 (25分)

2021天梯賽訓練-3——7-11 字尾式求值 (25分)

技術標籤:2020HBU訓練營&&天梯賽

我們人類習慣於書寫“中綴式”,如 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; }