84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
今天,下午有一個面試,二面的時候有道算法題,我對演算法一竅不通,求大神解惑
題目是 實現計算加減乘除括號運算的函數 輸入字串 類似 (1 2)/4 5 (3 5)*3 類似的合法運算能不能稍微講解下大體思路是什麼?面試大哥當時語重心長的說了聲這是演算法題,我想不應該是eval()這種實作吧?
用调度场算法把中缀表达式改后缀表达式(逆波兰表达式)
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 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是个办法,但比较不规范,大多数情况下不要用。
这题的正规加法二叉树运算四则表达式
用栈来实现表达式求值,百度下,有的
可以用数据结构上的逆波兰式
最通用的方法是语法分析,构建表达式树,然后求解。你可以自己写,也可以用一个很专业很通用的库叫Antlr。当然面试的时候应该是让你自己分析语法构建语法树了,真正做的时候还是Antlr更好一些。
javascript中解析四则运算表达式的算法和示例,楼主阔以看一哈
javascript中解析四则运算表达式的算法和示例
我不推荐采用eval这个被抛弃的方法。一.推荐使用正则表达式 二.使用数据结构中的栈的方法推荐一本书:学习JavaScript数据结构与算法最近刚好在研究栈,队列,二叉树这些东西
这...输入字符串的话.你直接用eval()咯
var a = '(1+2)/4+5+(3+5)*3';eval(a);
解析字符串四则运算常用的是逆波兰法
用栈来实现,两年前我做数据结构实验的时候歇过一个,还带公式合法性检测呢,等我找找放哪了好吧,找不到了,大致印象就是要做一个二维数组来判断运算符优先级,然后计算用栈来实现
用调度场算法把中缀表达式改后缀表达式(逆波兰表达式)
eval是个办法,但比较不规范,大多数情况下不要用。
这题的正规加法二叉树运算四则表达式
用栈来实现表达式求值,百度下,有的
可以用数据结构上的逆波兰式
最通用的方法是语法分析,构建表达式树,然后求解。
你可以自己写,也可以用一个很专业很通用的库叫Antlr。
当然面试的时候应该是让你自己分析语法构建语法树了,真正做的时候还是Antlr更好一些。
javascript中解析四则运算表达式的算法和示例,
楼主阔以看一哈
javascript中解析四则运算表达式的算法和示例
我不推荐采用eval这个被抛弃的方法。一.推荐使用正则表达式 二.使用数据结构中的栈的方法
推荐一本书:学习JavaScript数据结构与算法
最近刚好在研究栈,队列,二叉树这些东西
这...输入字符串的话.
你直接用eval()咯
var a = '(1+2)/4+5+(3+5)*3';
eval(a);
解析字符串四则运算常用的是逆波兰法
用栈来实现,两年前我做数据结构实验的时候歇过一个,还带公式合法性检测呢,等我找找放哪了
好吧,找不到了,大致印象就是要做一个二维数组来判断运算符优先级,然后计算用栈来实现