1 #include<stdio.h>
2 #include<stdlib.h>
3 #define N 1010
4 char s[N];
5 //字符栈的操作
6 typedef struct
7 {
8 char *base;
9 char *top;
10 }SqStack1;
11 int InitStack1(SqStack1 &S)
12 {
13 S.base=(char *)malloc(N*sizeof(char));
14 if(!S.base) exit(1);
15 S.top=S.base;
16 return 1;
17 }
18 int StackEmpty1(SqStack1 &S)
19 {
20 if(S.top==S.base)
21 return 1;
22 return 0;
23 }
24 char GetTop1(SqStack1 S)
25 {
26 char e;
27 if(S.top==S.base) return 0;
28 e=*(S.top-1);
29 return e;
30 }
31 int Push1(SqStack1 &S,char e)
32 {
33 *S.top++=e;
34 return 1;
35 }
36 int Pop1(SqStack1 &S,char &e)
37 {
38 if(S.top==S.base) return 0;
39 e=*--S.top;
40 return 1;
41 }
42 //数字栈的操作
43 typedef struct
44 {
45 float *base;
46 float *top;
47 }SqStack2;
48 int InitStack2(SqStack2 &S)
49 {
50 S.base=(float *)malloc(N*sizeof(float));
51 if(!S.base) exit(1);
52 S.top=S.base;
53 return 1;
54 }
55 int StackEmpty2(SqStack2 &S)
56 {
57 if(S.top==S.base)
58 return 1;
59 else return -1;
60 }
61 float GetTop2(SqStack2 S)
62 {
63 float e;
64 if(S.top==S.base) return 0;
65 e=*(S.top-1);
66 return e;
67 }
68 int Push2(SqStack2 &S,float e)
69 {
70 *S.top++=e;
71 return 1;
72 }
73 int Pop2(SqStack2 &S,float &e)
74 {
75 if(S.top==S.base) return 0;
76 e=*--S.top;
77 return 1;
78 }
79 //转化的操作过程
80 float Operate(float a,char theta,float b)
81 {
82 switch(theta)
83 {
84 case '+': return a+b;
85 case '-': return a-b;
86 case '*': return a*b;
87 case '/': return a/b;
88 default: return 0;
89 }
90 }
91 int level(char c,int i)
92 {
93 switch(c)
94 {
95 case '=': return 1;
96 case ')': return i?2:5;
97 case '+':
98 case '-': return 3;
99 case '*':
100 case '/': return 4;
101 case '(': return i?5:2;
102 default : return 0;
103 }
104 }
105 char Precede(char c1,char c2)
106 {
107 int k=(c1=='('&&c2=='=')||(c1=='='&&c2==')')||(c1==')'&&c2=='(');
108 if(!k)
109 {
110 if(c1=='('&&c2==')') return '=';
111 else
112 {
113 if(level(c1,0)<level(c2,1)) return '<';
114 else return '>';
115 }
116 }
117 return 0;
118 }
119 float EvaluateExpression()
120 {
121 SqStack1 OPTR; SqStack2 OPND;
122 char theta,c,x; float a,b,k,t; char *p1,*p=s;
123 InitStack1(OPTR); Push1(OPTR,'=');
124 InitStack2(OPND); c=*p;
125 while(c!='='||GetTop1(OPTR)!='=')
126 {
127 if(!level(c,1))
128 {
129 for(t=k=0;!level(c,1)&&c!='.';c=*++p)
130 k=10*k+c-'0';
131 if(c=='.')
132 {
133 while(!level(*++p,1)); c=*p;
134 for(p1=p-1;*p1!='.';p1--)
135 t=0.1*t+*p1-'0';
136 t*=0.1;
137 }
138 Push2(OPND,k+t);
139 }
140 else
141 switch(Precede(GetTop1(OPTR),c))
142 {
143 case'<': Push1(OPTR,c);c=*++p;break;
144 case'=': Pop1(OPTR,x); c=*++p;break;
145 case'>':
146 Pop1(OPTR,theta);
147 Pop2(OPND,b); Pop2(OPND,a);
148 Push2(OPND,Operate(a,theta,b));
149 }
150 }
151 return GetTop2(OPND);
152 }
153 //主函数
154 int main()
155 {
156 int n;
157 scanf("%d%*c",&n);
158 while(n--)
159 {
160 gets(s);
161 printf("%.2f\n",EvaluateExpression());
162 }
163 return 0;
164 }