复习经典算法,原算法:数据结构(用面向对象方法与c++描述) 112页 。
效果:
代码:
<script> var postfix=function(){ //栈内优先数 var isp={ '(':1, '^':7, '*':5, '/':5, '%':5, '+':3, '-':3, ')':8 }; //栈外优先数 var icp={ '(':8, '^':6, '*':4, '/':4, '%':4, '+':2, '-':2, ')':1 }; //左括号栈外优先级最高,它一来立即进栈,其栈内优先级最低,便于括号内操作符进栈,其他操作符进栈后优先级都升一, //这样可体现出中缀表达式相同优先级的操作符从左向右计算的要求,让位于栈顶的操作符先退栈并输出。 return function(exp){ //后缀表达式 var buffer=[]; //操作符栈 var stack=[]; //当前中缀表达式扫描字符 var el; //当前操作符栈栈顶元素 var top; for(var i=0,l=exp.length;i<l;i++) { el=exp.charAt(i); //数字元素 if(!isp[el]) { buffer.push(el); continue; } if(stack.length===0) { stack.push(el); continue; } top=stack[stack.length-1]; while(isp[top]>=icp[el]) { // ( ) 匹配 if(isp[top] == icp[el]) { stack.pop(); break; } buffer.push(stack.pop()); top=stack[stack.length-1]; } //不是 ()匹配 ,当前字符如栈 if(isp[top]!=icp[el]) { stack.push(el); } } //栈内操作符都出来吧,没数字了 while(stack.length) { buffer.push(stack.pop()); } return buffer.join(''); }; }(); //测试 //abc*de+f^*+h+ alert(postfix("a+b*c*(d+e)^f+h")); </script>