标签:while == push 逆波兰 javascrip foreach return result fun
实现过程:
1.首先创建两个空数组,result用来存放结果,temp用来存放符号;再创建一个符号集ops存放+-*/符号
2.转表达式字符为数组,开始遍历数组
3.如果遇到运算符,直接推入结果数组
4.遇到括号
1)遇到‘(‘,推入暂存区
2)遇到‘)‘,依次弹出暂存区栈顶运算符直到‘(‘,并且删除暂存区的‘(‘
5.遇到运算符
1)如果暂存区
①为空
②暂存区栈顶为‘(‘
③当前符号的优先级高于暂存区栈顶运算符
这几种情况直接推入栈内
2)否则,将暂存区栈顶运算符弹出并推入结果区,再次进行步骤5
6.遍历完成则将暂存区剩余运算符依次弹出并推入结果区
function rp(str) { var arr = str.split(‘‘); var ops = ‘+-#*/‘.split(‘‘); // #用来分级,+-是同一级,*/同一级,两级之间的位置差至少为2 var result = [], temp = []; arr.forEach(function(ele, ind) { if (ele == ‘(‘) { temp.push(ele); // 左括号直接推入暂存区 } else if (ele == ‘)‘) { var flag = true; while (flag) { if (temp[temp.length-1] != ‘(‘) { result.push(temp.pop()) } else { temp.pop(); flag = false; } } } else if (ops.indexOf(ele) != -1) { cb(ele, temp) function cb(x, o) { if (o.length == 0 || o[o.length-1] == ‘(‘ || ops.indexOf(x) - ops.indexOf(o[o.length-1]) > 2) { //判断分级 o.push(x) } else { result.push(o.pop()); return cb(x, o) } } } else { result.push(ele); } }) while (temp.length > 0) { if(temp[temp.length-1] != ‘(‘) { result.push(temp.pop()) } else { temp.pop() } } return result.join(‘‘); }
实现步骤是参考一个java写的实现过程的,然而再去找没找到那篇文章了,找到再补上。。
标签:while == push 逆波兰 javascrip foreach return result fun
原文地址:http://www.cnblogs.com/amenging/p/7745607.html