码迷,mamicode.com
首页 > 其他好文 > 详细

NYOJ 128 前缀式计算

时间:2014-08-31 00:18:00      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   ar   for   数据   div   log   

前缀式计算

时间限制: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 #include<stdio.h>
  2 #include<string.h>
  3 #include<stack>
  4 using namespace std;
  5 double calPerfix(char *input)
  6 {
  7     stack<double> result;
  8     int len = strlen(input) - 1;
  9     int n,j,i;
 10     while (len >= 0)
 11     {
 12         j = len;
 13         double sum = 0.0,dot = 0.0;
 14         if (len == 0){
 15             j = 0;
 16             n = j;
 17         }
 18         else {
 19             while (input[j] !=  )
 20                 j--;
 21             n = j+1;
 22         }
 23         if (input[n] >= 0 && input[n] <= 9){
 24         for (i=n; i <= len; i++)
 25         {
 26             if(input[i] >= 0 && input[i] <= 9)
 27             {
 28                 double num = input[i] - 0;
 29                 sum = sum * 10 + num;
 30             }
 31             else if (input[i] == .)
 32             {
 33                 int l = 10;
 34                 dot = 0.0;
 35                 for (int k=i+1; k <= len; k++ )
 36                 {
 37                     if(input[k] >= 0 && input[k] <= 9)
 38                     {
 39                         double num = input[k] - 0;
 40                         dot += num / l;
 41                         l *= 10;
 42                         i++;
 43                     }
 44                 }
 45             }
 46         }
 47         sum += dot;
 48         result.push(sum);
 49         }
 50         else {
 51             double one;
 52             switch (input[n])
 53             {
 54             case +:
 55                 sum = result.top();
 56                 result.pop();
 57                 one = result.top();
 58                 result.pop();
 59                 sum += one;
 60                 result.push(sum);
 61                 break;
 62             case -:
 63                 sum = result.top();
 64                 result.pop();
 65                 one = result.top();
 66                 result.pop();
 67                 sum -= one;
 68                 result.push(sum);
 69                 break;
 70             case *:
 71                 sum = result.top();
 72                 result.pop();
 73                 one = result.top();
 74                 result.pop();
 75                 sum *= one;
 76                 result.push(sum);
 77                 break;
 78             case /:
 79                 sum = result.top();
 80                 result.pop();
 81                 one = result.top();
 82                 result.pop();
 83                 sum /= one;
 84                 result.push(sum);
 85                 break;
 86             default:
 87                 break;
 88             }
 89         }
 90         len = j - 1;
 91     }
 92     return result.top();
 93 }
 94 int main()
 95 {
 96     char input[10000];
 97     while(gets(input)){
 98         printf("%.2f\n",calPerfix(input));
 99         fflush(stdin);
100     }
101     return 0;
102 }

 

NYOJ 128 前缀式计算

标签:style   blog   color   io   ar   for   数据   div   log   

原文地址:http://www.cnblogs.com/george-cw/p/3947120.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!