`
yiminghe
  • 浏览: 1431443 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

后缀表达式的javascript转化演示

阅读更多

复习经典算法,原算法:数据结构(用面向对象方法与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>
  • 大小: 3.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics