郁闷的C小加(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
 
描述

聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很高兴。但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值。即先把表达式转换为后缀表达式,再求值。这时又要考虑操作数是小数和多位数的情况。

 
输入
第一行输入一个整数T,共有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数并且小于1000000。
数据保证除数不会为0。
输出
对于每组测试数据输出结果包括两行,先输出转换后的后缀表达式,再输出计算结果,结果保留两位小数。两组测试数据之间用一个空行隔开。
样例输入
2
1+2=
(19+21)*3-4/5=
样例输出
12+=
3.00

1921+3*45/-=
119.20
来源
改编自NYOJ
 
  1 #include <cstdio>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <stack>
  5 #include <cctype>
  6 
  7 using namespace std;
  8 
  9 char str[1005];
 10 stack<char> Optr;
 11 stack<float> Opnd;
 12 
 13 char judge(char c1, char c2)
 14 {
 15     if(c1 == '+' || c1 == '-')
 16     {
 17         if(c2 == '*' || c2 == '/' || c2 == '(')
 18             return '<';
 19         else
 20             return '>';
 21     }
 22     if(c1 == '*' || c1 == '/')
 23     {
 24         if(c2 == '(')
 25             return '<';
 26         return '>';
 27     }
 28     if(c1 == '(' && c2 == ')' || c1 == '=' && c2 == '=')
 29         return '=';
 30     return '<';
 31 }
 32 
 33 float cal(float num1, float num2, char p)
 34 {
 35     if(p == '+')
 36         return num1 + num2;
 37     else if(p == '-')
 38         return num1 - num2;
 39     else if(p == '*')
 40         return num1 * num2;
 41     else if(p == '/')
 42         return num1 / num2;
 43 }
 44 
 45 void change()
 46 {
 47     int len = strlen(str);
 48     while(!Opnd.empty())
 49         Opnd.pop();
 50     while(!Optr.empty())
 51         Optr.pop();
 52     Optr.push('=');
 53     
 54     for(int i = 0; i < len;)
 55     {
 56         if(isdigit(str[i]) || str[i] == '.')
 57         {
 58             float t1 = 0;
 59             int t2 = 1;
 60             bool flag = false;
 61             while(isdigit(str[i]) || str[i] == '.')
 62             {
 63                 if(flag)
 64                     t2 *= 10;
 65                 if(isdigit(str[i]))
 66                     t1 = t1*10+str[i]-'0';
 67                 else
 68                     flag = true;
 69                 printf("%c", str[i]);                
 70                 ++i;
 71             }
 72             Opnd.push(t1/t2);
 73         }
 74         else
 75         {
 76             char tmp = judge(Optr.top(), str[i]);
 77             if(tmp == '<')
 78             {
 79                 Optr.push(str[i]);
 80                 ++i;
 81             }
 82             else if(tmp == '>')
 83             {
 84                 tmp = Optr.top();
 85                 printf("%c", tmp);
 86                 Optr.pop();
 87                 float num1 = Opnd.top();
 88                 Opnd.pop();
 89                 float num2 = Opnd.top();
 90                 Opnd.pop();
 91                 Opnd.push(cal(num2, num1, tmp));
 92                 //++i;
 93             }
 94             else
 95             {
 96                 Optr.pop();
 97                 ++i;
 98             }
 99         }
100     }
101 }
102 
103 int main()
104 {
105     int T;
106     scanf("%d", &T);
107     while(T--)
108     {
109         scanf("%s", str);
110         change();
111         printf("=\n%.2f\n", Opnd.top());
112         if(T)
113             printf("\n");
114     }
115     return 0;
116 }

 

posted on 2013-06-30 16:58  可笑痴狂  阅读(498)  评论(0编辑  收藏  举报