• 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 }
  • 相关阅读:
    element 树形控件使用
    js粘贴图片并显示
    vue-element Tree树形控件通过id默认选中
    解决win10shift+右键显示在此处打开powershell而不是命令窗口的问题
    maven安装与配置
    解决dos窗口中文乱码问题
    vue单页面应用刷新网页后vuex的state数据丢失的解决方案
    vue 单个倒计时组件
    js将秒转换为时分秒
    vue3.0用vue-awesome-swiper
  • 原文地址:https://www.cnblogs.com/george-cw/p/3947120.html
Copyright © 2020-2023  润新知