复习经典算法,原算法:数据结构(用面向对象方法与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>
本文介绍了一种将中缀表达式转换为后缀表达式的算法实现,并通过JavaScript代码详细展示了转换过程。该算法利用栈结构进行操作符的优先级判断与处理,实现了按操作符优先级正确转换表达式的目标。

3436

被折叠的 条评论
为什么被折叠?



