#P2792. Brackets Removal
Brackets Removal
描述
考虑由小写字母 "a" 到 "z" 表示的变量组成的算术表达式;
包含四种二元算术运算:加法()、减法()、乘法()和除法(),以及圆括号""和""。运算的优先级遵循常规规则——乘法和除法的优先级最高,加法和减法的优先级最低。
相同优先级的运算从左到右计算(例如,)。
因此,表达式的语法如下:
<表达式> --> <项> | <表达式> + <项> | <表达式> - <项>
<项> --> <因子> | <项> * <因子> | <项> / <因子>
<因子> --> <变量> | (<表达式>)
<变量> --> a | b | ... | z
你的任务是重写给定的表达式,使其语义不变,但圆括号的数量最少。
你可以移除任何不影响运算顺序的多余括号,例如:
并且可以通过以下规则重写表达式:
-
如果 和 是任意表达式,可以将 改为 。例如:
$a - g/h + (b + c - d + e * (f + h - i)) \Rightarrow a - g/h + b + c - d + e * (f + h - i)$ -
如果 和 是任意表达式,可以将 改为 ,其中 是通过将 中所有最外层的 和 互换得到的。例如:
$a - g/h - (b + c - d + e * (f + h - i)) \Rightarrow a - g/h - b - c + d - e * (f + h - i)$ -
如果 和 是任意项,可以将 改为 。例如:
$x/(y + z) * (a * (b - c)/d/(e/f)) \Rightarrow x/(y + z) * a * (b - c)/d/(e/f)$ -
如果 和 是任意项,可以将 改为 ,其中 是通过将 中所有最外层的 和 互换得到的。例如:
$x/(y + z)/(a * (b - c)/d/(e/f)) \Rightarrow x/(y + z)/a/(b - c) * d * (e/f)$
你可以根据需要多次应用上述转换和移除多余括号,直到表达式的圆括号数量最少。
输入
输入包含一行表达式。表达式不包含前导、尾随或内部的空格,且最多由1000个字符组成。
输出
输出一行重写后的表达式,圆括号数量最少。不要输出任何空格。
输入数据 1
((a-b)-(c-d)-(z*z*g/f)/(p*(t))*((y-u)))
输出数据 1
a-b-c+d-z*z*g/f/p/t*(y-u)
来源
Northeastern Europe 2005