题目描述
按中缀形式输入一个四则运算的表达式,把其转换为后缀表达式输出,并求表达式的值。
表达式会包含小数和负数,比如 `-(-3+1.3*2.)-.4`,其中 `2.` 和 `.4` 省略了 `0`,表示 `2.0` 和 `0.4`,但不会出现小数点两端都省略的情况。
题目保证表达式是合法的,即不会出现 `2(-)3`,`(3+2)*5)`,`()`,`1+.*3,2*-3`,`001+2.3`,`--3` 等情况,也不会以正号描述一个正数,如 `+3`。
输入格式
第一行包含一个整数 $T$ $(1 \le T \le 10)$,表示有 $T$ 组数据。
每组数据占一行,为一个带小括号的四则运算中缀表达式,包含空格,并且操作数可能是最多包含三位小数的浮点数,表达式长度小于 $200$.
数据保证只会出现阿拉伯数字,`.`,`+`,`-`,`*`,`/`,`(`,`)` 这些符号。
数据保证整个运算过程中不会出现过小或过大的数,也不会出现除 $0$ 的情况。
输出格式
对于每组测试数据,输出两行,第一行输出四则运算表达式的后缀表达式(每个数字或者操作符之间输出空格),第二行输出运算结果。
所有数字在输出时四舍五入保留三位小数。
输出后缀表达式时,需要区分负号和减号,因此用 `!` 表示单目运算符取相反数,详见样例。
样例输入 #1
5
-(-3*1.3*1.5+2.)-.5
3+.2/0.7
-(-.5+3.)*2.5
0.2/1000/1000
5-2-1-(-5)/(-3)
样例输出 #1
3.000 ! 1.300 * 1.500 * 2.000 + ! 0.500 -
3.350
3.000 0.200 0.700 / +
3.286
0.500 ! 3.000 + ! 2.500 *
-6.250
0.200 1000.000 / 1000.000 /
0.000
5.000 2.000 - 1.000 - 5.000 ! 3.000 ! / -
0.333
提示
观察第一个样例和第三个样例,取负的优先级比加减乘除都要高,只比乘方低。因此会在计算加减乘除前先取负。
在后缀表达式计算时,遇到取负号 `!` 时,就把当前栈顶的数取负即可。
如第三个样例的计算过程如下:
- `0.500 ! 3.000 + ! 2.500 *`
- `-0.500 3.000 + ! 2.500 *`
- `2.500 ! 2.500 *`
- `-2.500 2.500 *`
- `-6.250`