pat02-线性结构3. 求前缀表达式的值(25)
02-线性结构3. 求前缀表达式的值(25)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式说明:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式说明:
输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。
样例输入与输出:
序号 | 输入 | 输出 |
1 |
+ + 2 * 3 - 7 4 / 8 4 |
13.0 |
2 |
/ -25 + * - 2 3 4 / 8 4 |
12.5 |
3 |
/ 5 + * - 2 3 4 / 8 2 |
ERROR |
4 |
+10.23 |
10.2 |
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<queue> 6 #include<vector> 7 #include<string> 8 #include<stack> 9 using namespace std; 10 int main(){ 11 //freopen("D:\\input.txt","r",stdin); 12 stack<double> fi; 13 stack<string> input; 14 string s; 15 16 //bool can=true; 17 while(cin>>s){ 18 input.push(s); 19 } 20 while(!input.empty()){ 21 s=input.top(); 22 input.pop(); 23 if(s.length()==1&&!(s[0]>='0'&&s[0]<='9')){ 24 double a=fi.top(); 25 fi.pop(); 26 double b=fi.top(); 27 fi.pop(); 28 switch(s[0]){ 29 case'+':{ 30 //cout<<"+: "<<a+b<<endl; 31 fi.push(a+b); 32 break; 33 } 34 case'-':{ 35 //cout<<"-: "<<a-b<<endl; 36 fi.push(a-b); 37 break; 38 } 39 case'*':{ 40 //cout<<"*: "<<a*b<<endl; 41 fi.push(a*b); 42 break; 43 } 44 case'/':{ 45 if(b==0){ 46 printf("ERROR\n"); 47 //can=false; 48 return 0; 49 } 50 //cout<<"/: "<<a/b<<endl; 51 fi.push(a/b); 52 break; 53 } 54 default:{ 55 printf("ERROR\n"); 56 return 0; 57 } 58 } 59 }else if((s[0]>='0'&&s[0]<='9')||(s.length()>1&&!(s[0]>='0'&&s[0]<='9')&&(s[1]>='0'&&s[1]<='9'))){ 60 double cal=1; 61 int i=0; 62 if(s[i]=='+'||s[i]=='-'){ 63 if(s[i]=='-'){ 64 cal=-1; 65 } 66 i++; 67 } 68 double intpart=0,decpart=0; 69 while(i<s.length()&&s[i]!='.'){//注意换算 70 intpart*=10; 71 intpart+=s[i++]-'0'; 72 } 73 i++; 74 int j; 75 for(j=s.length()-1;j>=i;j--){ 76 decpart+=s[j]-'0'; 77 decpart*=0.1; 78 } 79 fi.push(cal*(intpart+decpart)); 80 }else{ 81 printf("ERROR\n"); 82 return 0; 83 } 84 } 85 //cout<<fi.top()<<endl; 86 87 printf("%.1lf\n",fi.top()); 88 return 0; 89 }