国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

javascript - 前端面試的一道演算法題
給我你的懷抱
給我你的懷抱 2017-05-19 10:27:19
0
11
1659

今天,下午有一個(gè)面試,二面的時(shí)候有道算法題,我對(duì)演算法一竅不通,求大神解惑

題目是 實(shí)現(xiàn)計(jì)算加減乘除括號(hào)運(yùn)算的函數(shù) 輸入字串 類似 (1 2)/4 5 (3 5)*3 類似的合法運(yùn)算
能不能稍微講解下大體思路是什麼?面試大哥當(dāng)時(shí)語(yǔ)重心長(zhǎng)的說(shuō)了聲這是演算法題,我想不應(yīng)該是eval()這種實(shí)作吧?

給我你的懷抱
給我你的懷抱

全部回覆(11)
左手右手慢動(dòng)作

用調(diào)度場(chǎng)演算法把中綴表達(dá)式改後綴表達(dá)式(逆波蘭表達(dá)式)

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));
}
淡淡煙草味

eval是個(gè)辦法,但比較不規(guī)範(fàn),大多數(shù)情況下不要用。

這題的正規(guī)加法二元樹(shù)運(yùn)算四則表達(dá)式

僅有的幸福

用棧來(lái)實(shí)現(xiàn)表達(dá)式求值,百度下,有的

小葫蘆

可以用資料結(jié)構(gòu)上的逆波蘭式

漂亮男人

最通用的方法是語(yǔ)法分析,建立表達(dá)式樹(shù),然後求解。
你可以自己寫(xiě),也可以用一個(gè)很專業(yè)很通用的函式庫(kù)叫Antlr。
當(dāng)然面試的時(shí)候應(yīng)該是讓你自己分析語(yǔ)法建立語(yǔ)法樹(shù)了,真正做的時(shí)候還是Antlr更好一些。

世界只因有你

javascript中解析四則運(yùn)算表達(dá)式的演算法和範(fàn)例,
樓主闊以看一哈

javascript中解析四則運(yùn)算表達(dá)式的演算法與範(fàn)例

巴扎黑

我不推薦採(cǎi)用eval這個(gè)被拋棄的方法。一.推薦使用正規(guī)表示式 二.使用資料結(jié)構(gòu)中的棧的方法
推薦一本書(shū):學(xué)習(xí)JavaScript資料結(jié)構(gòu)與演算法
最近剛好在研究棧,佇列,二叉樹(shù)這些東西

漂亮男人

這...輸入字串的話.
你直接用eval()咯

var a = '(1+2)/4+5+(3+5)*3';
eval(a);

巴扎黑

解析字串四則運(yùn)算常用的是逆波蘭法

大家講道理

用棧來(lái)實(shí)現(xiàn),兩年前我做數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)的時(shí)候歇過(guò)一個(gè),還帶公式合法性檢測(cè)呢,等我找找放哪了

好吧,找不到了,大致印象就是要做一個(gè)二維數(shù)組來(lái)判斷運(yùn)算子優(yōu)先權(quán),然後計(jì)算用堆疊來(lái)實(shí)現(xiàn)

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板