Shunting Algorithm

by egon

HTML

<style>
* {
    font:normal 12px/16px Courier New, monospace;
    padding: 0;
    margin: 0;
};
</style>
<pre id="logDiv"></pre>
<script>
log = (function(){
    var logDiv = document.getElementById("logDiv");
    return function(context, args){
        logDiv.innerHTML = 
            "<p>" + context + " : " + JSON.stringify(args) + "</p>" + 
            logDiv.innerHTML;
        };
})();
</script>

JavaScript

function isNumber(n){
    return !isNaN(parseFloat(n)) && isFinite(n);
}

calc = "3 4 +";
stack = calc.split(/\s+/);
args = [];

while (stack.length > 0){
    token = stack.pop();
    log("stck: ", stack);
    log("tok: ", token);    
    if( isNumber(token)) {
        log("value: ", token);
        a = parseFloat(token);
        args.push(a);
    } else if( token == "+" ){
        a = args.pop();
        b = args.pop();
        stack.push( a + b );
    } else if ( token == "-" ){
        a = args.pop();
        b = args.pop();
        stack.push( a - b );
    } else if (token == "sin" ){
        a = args.pop();
        stack.push( Math.sin(a) )
    } else {
        log("err: ", token);
        throw "up";
    }
}