zoukankan      html  css  js  c++  java
  • NYOJ 128 前缀式计算

    前缀式计算

    时间限制: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
    ",calPerfix(input));
     99         fflush(stdin);
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    Begin Example with Override Encoded SOAP XML Serialization
    State Machine Terminology
    How to: Specify an Alternate Element Name for an XML Stream
    How to: Publish Metadata for a WCF Service.(What is the Metadata Exchange Endpoint purpose.)
    Beginning Guide With Controlling XML Serialization Using Attributes(XmlSerializaiton of Array)
    Workflow 4.0 Hosting Extensions
    What can we do in the CacheMetaData Method of Activity
    How and Why to use the System.servicemodel.MessageParameterAttribute in WCF
    How to: Begin Sample with Serialization and Deserialization an Object
    A Test WCF Service without anything of config.
  • 原文地址:https://www.cnblogs.com/george-cw/p/3947120.html
Copyright © 2011-2022 走看看