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