前缀式计算

前缀式计算

时间限制: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


解题思路:本来用了stl的栈,结果超时,自己写个数组栈之后才过了。
  做的时候很多小错误,不断改。。。。终于过了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int main()
{
    double stac[505];
    int si=0;
    double result;
    char t;
    double temp;
    char a[1000];
    while(gets(a)!=NULL){
       si=0;
       for(int i=0;i<3;i++){
           temp=a[i];
       }
       int len=strlen(a);
        for(int i=len-1;i>=0;i--){
            if(a[i]==' '||i==0){
                if(i==0){
                    sscanf(a+i,"%c",&t);
                }else{
                    sscanf(a+i+1,"%c",&t);
                }

                if(t>='0'&&t<='9'){
                    sscanf(a+i,"%lf",&temp);
                    stac[si]=temp;
                    si++;
                }else{
                    if(t=='+'){
                        double d1=stac[si-1];
                        si--;
                        double d2=stac[si-1];
                        si--;
                        d1+=d2;
                        stac[si]=d1;
                        si++;
                    }
                    if(t=='-'){
                        double d1=stac[si-1];
                        si--;
                        double d2=stac[si-1];
                        si--;
                        d1-=d2;
                        stac[si]=d1;
                        si++;
                    }
                    if(t=='*'){
                       double d1=stac[si-1];
                        si--;
                        double d2=stac[si-1];
                        si--;
                        d1*=d2;
                        stac[si]=d1;
                        si++;
                    }
                    if(t=='/'){
                        double d1=stac[si-1];
                        si--;
                        double d2=stac[si-1];
                        si--;
                        d1/=d2;
                        stac[si]=d1;
                        si++;
                    }

                }

            }
        }
        temp=stac[si-1];
        si--;
        printf("%.2f\n",temp);
    }
    return 0;
}

 

 
posted @ 2016-08-25 17:10  多一份不为什么的坚持  阅读(371)  评论(0编辑  收藏  举报