后缀表达式的javascript转化演示

本文介绍了一种将中缀表达式转换为后缀表达式的算法实现,并通过JavaScript代码详细展示了转换过程。该算法利用栈结构进行操作符的优先级判断与处理,实现了按操作符优先级正确转换表达式的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复习经典算法,原算法:数据结构(用面向对象方法与c++描述) 112页 。


效果:

 

 

演示@google code


代码:

 

<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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值