亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

前端面試的一道算法題

前端面試的一道算法題

ITMISS 2018-07-31 12:13:21
今天,下午有一個面試,二面的時候有道算法題,我對算法一竅不通,求大神解惑題目是 實現計算加減乘除括號運算的函數 輸入字符串 類似 (1+2)/4+5+(3+5)*3 類似的合法運算能不能稍微講解下大體思路是什么?面試大哥當時語重心長的說了聲這是算法題,我想不應該是eval()這種實現吧?
查看完整描述

3 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

eval是個辦法,但比較不規范,大多數情況下不要用。

這題的正規加法二叉樹運算四則表達式


查看完整回答
反對 回復 2018-08-04
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

用調度場算法把中綴表達式改后綴表達式(逆波蘭表達式)

var A = '((112 + 2) * (32 + (43 + 45 - 46) * 12))';


function is_op(val) {

    var op_string = '+-*/()';

    return op_string.indexOf(val) > -1;

}


function init_expression(expression) {

    var expression = expression.replace(/\s/g, ''),

        input_stack = [];

    input_stack.push(expression[0]);

    for (var i = 1; l = expression.length, i<l; i++) {

        if (is_op(expression[i]) || is_op(input_stack.slice(-1))) {

            input_stack.push(expression[i]);

        } else {

            input_stack.push(input_stack.pop()+expression[i]);

        }

    }

    return input_stack;

}


function op_level (op) {

    if (op == '+' || op == '-') {

        return 0;

    }

    if (op == '*' || op == '/') {

        return 1;

    }

    if (op == '(') {

        return 3;

    }

    if (op == ')') {

        return 4;

    }

}


function RPN (input_stack) {

    var out_stack = [], op_stack = [], match = false, tmp_op;

    while (input_stack.length > 0 ) {

        var sign = input_stack.shift();

        if (!is_op(sign)) {

            out_stack.push(sign);

        } else if (op_level(sign) == 4) {

            match = false;

            while (op_stack.length > 0 ) {

                tmp_op = op_stack.pop();

                if ( tmp_op == '(') {

                    match = true;

                    break;

                } else {

                    out_stack.push(tmp_op);

                }

            } 

            if (match == false) {

                return 'lack left';

            }

        } else {

            while ( op_stack.length > 0 && op_stack.slice(-1) != '(' && op_level(sign) <= op_level(op_stack.slice(-1))) {

                out_stack.push(op_stack.pop());

            }

            op_stack.push(sign);   

        }

    }

    while (op_stack.length > 0 ){

        var tmp_op = op_stack.pop();

        if (tmp_op != '(') {

            out_stack.push(tmp_op);

        } else {

            return 'lack right';

        }

    }

    return out_stack;

}


function cal(expression) {

    var i, j, 

        RPN_exp = [],

        ans;

    while (expression.length > 0) {

        var sign = expression.shift();

        if (!is_op(sign)) {

            RPN_exp.push(sign);

        } else {

            j = parseFloat(RPN_exp.pop());

            i = parseFloat(RPN_exp.pop());

            RPN_exp.push(cal_two(i, j, sign));

        }

    }

    return RPN_exp[0];

}


function cal_two(i, j, sign) {

    switch (sign) {

        case '+':

            return i + j;

            break;

        case '-':

            return i - j;

            break;

        case '*':

            return i * j;

            break;

        case '/':

            return i / j;

            break;

        default:

            return false;

    }

}



var expression = RPN(init_expression(A))

if (expression == 'lack left' || expression == 'lack right') {

    console.log(expression);

} else {

    console.log(cal(expression));

}


查看完整回答
反對 回復 2018-08-04
  • 3 回答
  • 0 關注
  • 1230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號