Python 2, 290 272 268 250 243 238 bytes
Now finally shorter than the JS answer!
This is a full program which uses a basic implementation of the shunting yard algorithm. Input is given as a quoted string, and the result is printed to STDOUT.
import re O=[];B=[] for t in re.findall('\d+|\S',input()):exec("O=[t]+O","i=O.index('(');B+=O[:i];O=O[i+1:]","while O and'('<O[0]and(t in'*/')<=(O[0]in'*/'):B+=O.pop(0)\nO=[t]+O","B+=`int(t)`,")[(t>'/')+(t>')')+(t>'(')] print' '.join(B+O) Explanation:
The first thing we need to do is convert the input into tokens. We do this using by finding all matches of the regex \d+|\S, roughly translated to "any group of digits, and any non-space character". This removes whitespace, parses adjacent digits as single tokens, and parses operators seperately.
For the shunting yard algorithm, there are 4 distinct token types we need to handle:
(- Left parenthesis)- Right parenthesis+-*/- Operators9876543210- Numeric literals
Thankfully, the ASCII codes of these are all grouped in the order shown, so we can use the expression (t>'/')+(t>')')+(t>'(') to calculate the token type. This results in 3 for digits, 2 for operators, 1 for a right parenthesis and 0 for a left parenthesis.
Using these values, we index into the large tuple after exec to get the corresponding snippet to execute, based on the token type. This is different for each token and is the backbone of the shunting yard algorithm. Two lists are used (as stacks): O (operation stack) and B (output buffer). After all the tokens have been run, the remaining operators on the O stack are concatenated with the output buffer, and the result is printed.