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\n",calPerfix(input));
 99         fflush(stdin);
100     }
101     return 0;
102 }

时间: 2024-10-19 23:01:45

NYOJ 128 前缀式计算的相关文章

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 输入 有多组测试数据,每

前缀式计算(前缀表达式)

前缀式计算 时间限制: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 输入 有多组测试数据,每

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 输入 有多组測试数

前缀式计算

前缀式计算 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示. 给你一个前缀表达式,请你计算出该前缀式的值. 比如: + 2 * + 3 4 5的值就是 37 输入 有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符

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 输入 有多组测试数据,每

NYOJ128 前缀式计算(栈的运用)

题目信息: http://acm.nyist.net/JudgeOnline/problem.php?pid=128 + 2 * + 3 4 5的值就是 37,详见输入输出. 输入 有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格.输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500. 以EOF为输入结束的标志. 输出 对每组数据,输出该前缀表达式的值.输出结果保留两位小数. 样例输入 + 2 *

南阳oj 前缀式计算 题目218

 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stack> #define N 1000 using namespace std; char s[N],b[3]; stack<double>num; stack<char>st; int main() { while(gets(s)) { int k=strlen(s); double a1,a2

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 输入 有多组测试数据,每

数式计算(递归解法)

1 /** 2 *注:1.有一个bug(以及未知什么bug) 我已知的是: ([email protected])(ps:@为运算符),这种带括号的表达式不能单独的出现,否则异常退出,,但是只要([email protected])@n 3 4 带括号的表达式出现任意+,-,*,/的运算都能进行正常运算(前面 [email protected]([email protected])也不可以)...不知道为什么()表达式后面没有操作时会异常退出. 5 *不知道如何解决.希望感兴趣的人帮帮忙! 6