后缀表达式加表达式求值

 

郁闷的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
 
  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stack>
  4 #include<stdlib.h>
  5 using namespace std;
  6 
  7 char a[1010];
  8 char b[1010];
  9 stack <char> s1;
 10 stack <float> s2;
 11 
 12 int i,j,n,m,t;
 13 float x,y,z;
 14 
 15 int fun(char x)
 16 {
 17     switch(x)
 18     {
 19         case '+' :
 20         case '-' :return 1;
 21         case '*' :
 22         case '/' :return 2;
 23         case '(' :return 0;
 24         default  :return -1;
 25     }
 26 }
 27 
 28 float js(float x,float y,char z)
 29 {
 30     switch(z)
 31     {
 32         case '+':return y+x;
 33         case '-':return y-x;
 34         case '*':return y*x;
 35         default :return y/x;
 36     }
 37 }
 38 
 39 int main()
 40 {
 41     int p;
 42     char c[1010];
 43     float d;
 44     scanf("%d",&t);
 45     s1.push('#');
 46     while(t--)
 47     {
 48         j=0;
 49         scanf("%s",a);
 50         m=strlen(a)-1;
 51         for(i=0;i<m;i++)
 52         {
 53             if(a[i]>='0'&&a[i]<='9'||a[i]=='.')
 54             {
 55                 memset(c,0,sizeof(c));
 56                 p=0;
 57                 while(a[i]>='0'&&a[i]<='9'||a[i]=='.')
 58                 {
 59                     b[j++]=a[i];
 60                     c[p++]=a[i++];
 61                 }
 62                 d=atof(c);
 63                 s2.push(d);
 64                 i--;
 65             }
 66 
 67             else if(a[i]=='(')  s1.push(a[i]);
 68 
 69             else if(a[i]==')')
 70             {
 71                 while(s1.top()!='(')
 72                 {
 73                     b[j++]=s1.top();
 74                     x=s2.top();s2.pop();
 75                     y=s2.top();s2.pop();
 76                     x=js(x,y,b[j-1]);
 77                     s2.push(x);
 78                     s1.pop();
 79                 }
 80                 s1.pop();
 81             }
 82 
 83             else 
 84             {
 85                 while(fun(s1.top())>=fun(a[i]))
 86                 {
 87                     b[j++]=s1.top();
 88                     x=s2.top();s2.pop();
 89                     y=s2.top();s2.pop();
 90                     x=js(x,y,b[j-1]);
 91                     s2.push(x);
 92                     s1.pop();
 93                 }
 94                 s1.push(a[i]);
 95             }
 96         }
 97 
 98         while(s1.top()!='#')
 99         {
100             b[j++]=s1.top();
101             x=s2.top();s2.pop();
102             y=s2.top();s2.pop();
103             x=js(x,y,b[j-1]);
104             s2.push(x);
105             s1.pop();
106         }
107         b[j]='=';
108         b[j+1]='\0';
109         puts(b);
110         printf("%.2f\n",s2.top());
111         s2.pop();
112     }
113     return 0;
114 }

 

posted @ 2013-05-29 20:07  萧凡客  阅读(3229)  评论(0编辑  收藏  举报