JavaScript(ES6)、285 282 281 267 251 243 241 238 234 232 231バイト
Neilのおかげで最大15バイト。
f=(I,E=I.match(/\d+|./g),i=0)=>(J=T=>T.map?T.map(J).join``:T)((R=(H,l=(P=_=>(t=E[i++])<")"?R(0):t)(),C,F)=>{for(;(C=P())>")"&&(q=C>"*"&&C<"/")*H-1;)F=q+H?l=[C,l,C,P(),C]:F?l[3]=[C,l[3],C,R(1),C]:l=R(1,l,i--)
i-=C>")"
return l})(0))
JavaScriptでは、これはMathematicaよりも少し難しいです。これは、基本的に、過剰に専門化された、ゴルフのオペレーター優先パーサーです。
無効な入力でスタックオーバーフローが発生します。
デモ
f=(I,E=I.match(/\d+|./g),i=0)=>(J=T=>T.map?T.map(J).join``:T)((R=(H,l=(P=_=>(t=E[i++])<")"?R(0):t)(),C,F)=>{for(;(C=P())>")"&&(q=C>"*"&&C<"/")*H-1;)F=q+H?l=[C,l,C,P(),C]:F?l[3]=[C,l[3],C,R(1),C]:l=R(1,l,i--)
i-=C>")"
return l})(0))
<input id="input" value="(5+3)*((9+18)/4-1)"/><button onclick="console.log(f(document.querySelector('#input').value))">Convert</button>
非ゴルフ
convert = input => {
tokens = input.match(/\d+|./g);
i = 0;
parse_token = () => (token = tokens[i++]) == "(" ? parse_tree(false) : token;
parse_tree = (mul_div_mode, left = parse_token()) => {
while ((oper = parse_token()) != ")" && !((is_plus_minus = oper == "+" || oper == "-") && mul_div_mode)) {
if (is_plus_minus || mul_div_mode)
left = [oper, left, oper, parse_token(), oper];
else if (non_first)
left[3] = [oper, left[3], oper, parse_tree(true), oper];
else
left = parse_tree(true, left, i--);
non_first = true;
}
if (oper != ")")
i--;
return left;
};
format_tree = tree => tree.map ? tree.map(format_tree).join("") : tree;
return format_tree(parse_tree(false));
}
S.split``である必要がありますが[...S]、実際には前もって一致し/\d+|./gて、代わりに作業するのに役立つ場合があります。