zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    我再也不相信正解了……
    悬线法
    防线 Defence
    奶牛浴场
    环状两段最大子段和
    三步必杀
    加工生产调度
    种树
    UVA11134 传说中的车 Fabled Rooks
    UVA 11054 Gergovia的酒交易 Wine trading in Gergovia
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4728467.html
Copyright © 2011-2022 走看看