• NYOJ128前缀式计算


     

    前缀式计算

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述

    先说明一下什么是中缀式:

    如2+(3+4)*5这种我们最常见的式子就是中缀式。

    而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))

    然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )

    把括号去掉就是:+ 2 * + 3 4 5

    最后这个式子就是该表达式的前缀表示。

    给你一个前缀表达式,请你计算出该前缀式的值。

    比如:

    + 2 * + 3 4 5的值就是 37

     
    输入
    有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
    以EOF为输入结束的标志。
    输出
    对每组数据,输出该前缀表达式的值。输出结果保留两位小数。
    样例输入
    + 2 * + 3 4 5
    + 5.1 / 3 7
    样例输出
    37.00
    5.53
    

     1 /* 功能Function Description:        NYOJ-128前缀式计算
     2    开发环境Environment:                DEV C++ 4.9.9.1
     3    技术特点Technique:
     4    版本Version:
     5    作者Author:                        可笑痴狂
     6    日期Date:                        20120804
     7    备注Notes:      
     8 */
     9 #include<cstdio>
    10 #include<stack>
    11 #include<cstring>
    12 #include<cctype>
    13 #include<cstdlib>
    14 using namespace std;
    15 
    16 char s[2000];
    17 int len;
    18 
    19 void cal()
    20 {
    21     int i,t,j,k,n,flag;
    22     char tmp[100];
    23     double a,b;
    24     stack<double> Opnd;
    25     for(i=len-1;i>=0;)
    26     {
    27         if(isdigit(s[i]))
    28         {
    29             j=i;
    30             t=0;
    31             a=0;
    32             n=1;
    33             flag=0;
    34             memset(tmp,'\0',sizeof(tmp));
    35             while(s[i]!=' ')
    36                 --i;
    37             k=i+1;
    38             for(;k<=j;++k)
    39             {
    40                 if(isdigit(s[k]))
    41                 {
    42                     a=a*10+s[k]-'0';
    43                     if(flag)
    44                         n*=10;
    45                 }
    46                 else
    47                     flag=1;
    48             }
    49             Opnd.push(a/n);
    50         }
    51         else if(s[i]==' ')
    52             --i;
    53         else
    54         {
    55             a=Opnd.top();
    56             Opnd.pop();
    57             b=Opnd.top();
    58             Opnd.pop();
    59             switch (s[i])
    60             {
    61                 case '+':
    62                     Opnd.push(a+b);
    63                     break;
    64                 case '-':
    65                     Opnd.push(a-b);
    66                     break;
    67                 case '*':
    68                     Opnd.push(a*b);
    69                     break;
    70                 default:
    71                     Opnd.push(a/b);
    72                     break;
    73             }
    74             --i;
    75         }
    76     }
    77     printf("%.2lf\n",Opnd.top());
    78 }
    79 
    80 int main()
    81 {
    82     while(gets(s))
    83     {
    84         len=strlen(s);
    85         cal();
    86     }
    87     return 0;
    88 }
     1 //代码二:------神一般的代码----不过只能测试一组测试数据,要改成多组不会改
     2 #include <stdio.h>
     3 #include<math.h>
     4 #include<stdlib.h>
     5 
     6 double exp()
     7 {
     8     char a[10];
     9     scanf("%s", a);
    10     switch(a[0])
    11     {
    12         case'+': return exp( ) + exp( );
    13         case'-': return exp( ) - exp( );
    14         case'*': return exp( ) * exp( );
    15         case'/': return exp( ) / exp( );
    16         default: return atof(a);
    17     }
    18 }
    19 int main()
    20 {
    21     double ans;
    22     ans=exp();
    23     printf("%.2f\n", ans);
    24     return 0;
    25 }
    功不成,身已退
  • 相关阅读:
    mybatis
    spring mvc
    Spring Boot2
    Spring AOP
    Spring Boot1
    Spring IOC
    Multiple_LinearRegression_Test2
    Multiple_LinearRegression_Test
    Simple_LinearRegression_Test
    写决策树时遇到的坑
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2622817.html
Copyright © 2020-2023  润新知