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
");
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
");
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
");
82             return 0;
83         }    
84     }
85     //cout<<fi.top()<<endl;
86     
87     printf("%.1lf
",fi.top());
88     return 0;
89 }