##Javascript (ES6), 244 bytes## f=(s,o={'+':1,'-':1,'*':2,'/':2},a=[],p='',g=c=>o[l=a.pop()]>=o[c]?g(c,p+=l+' '):a.push(l||'',c))=>(s.match(/[)(+*/-]|\d+/g).map(c=>o[c]?g(c):(c==')'?eval(`for(;(i=a.pop())&&i!='(';)p+=i+' '`):c=='('?a.push(c):p+=+c+' ')),p+a.reverse().join` `) **Example:** Call: `f('0-1+(2-3)*4-5*(6-(7+8)/9+10)')` Output: `0 1 - 2 3 - 4 * + 5 6 7 8 + 9 / - 10 + * - ` (with a trailing space) **Explanation:** f=(s, //Input string o={'+':1,'-':1,'*':2,'/':2}, //Object used to compare precedence between operators a=[], //Array used to stack operators p='', //String used to store the result g=c=> //Function to manage operator stack o[l=a.pop()]>=o[c]? // If the last stacked operator has the same or higher precedence g(c,p+=l+' '): // Then adds it to the result and call g(c) again a.push(l||'',c) // Else restack the last operator and adds the current one, ends the recursion. )=> (s.match(/[)(+*/-]|\d+/g) //Getting all operands and operators .map(c=> //for each operands or operators o[c]? //If it's an operator defined in the object o g(c) //Then manage the stack :(c==')'? //Else if it's a closing parenthese eval(` //Then for(;(i=a.pop())&&i!='(';) // Until it's an opening parenthese p+=i+' ' // Adds the last operator to the result `) :c=='('? //Else if it's an opening parenthese a.push(c) //Then push it on the stack :p+=+c+' ' //Else it's an operand: adds it to the result (+c removes the leading 0s) ) ) ,p+a.reverse().join` `) //Adds the last operators on the stack to get the final result