欢迎来到天天文库
浏览记录
ID:37718776
大小:16.22 KB
页数:6页
时间:2019-05-29
《编译原理之表达式求值》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理之表达式求值中缀表达式a+b*(c+d)-e前续表达式(波兰)-e+a*b+cd后续表达式(逆波兰)abcd+*e-+中缀转后缀1.构建二叉树->后续遍历2.堆栈方法:中缀表达式到逆波兰表达式的转换及求值 (ChinaDHF)最近要写一个工资管理软件,不可避免的要用到公式的定义及求值等问题。对于数学表达式的计算,虽然也有直接对表达式进行扫描并按照优先级逐步计算的方法,但感觉还是不如将中缀表达式转换为逆波兰表达式更容易处理。 使用逆波兰表达式,则有以下几件工作需要去做: 1.对中缀表达式进行语法分析,或称合法性检查。
2、 2.将中缀表达式转换为逆波兰表达式。 3.计算逆波兰表达得到我们想要的值。以下是我为实现该功能而写的一个简单的类:usingSystem;usingSystem.Text;usingSystem.Collections;usingSystem.Text.RegularExpressions;namespaceSeaking{ publicclassRpnExpression { 检查中缀表达式的合法性#region检查中缀表达式的合法性 /// ///检查中缀表
3、达式是否合法。 /// /// /// publicstaticboolIsRight(stringexp) { stringpMatch=@"([^(^)]+)";//匹配最“内”层括号及表达式 stringnumberMatch=@"d+(.d+)?";//匹配数字 stringexMa
4、tch=@"^0([-+*/]0)*$";//匹配无括号的、用0替换所有的数字后的表达式 exp=Regex.Replace(exp,numberMatch,"0");//为简化检测,用0替换所有的数字 while(Regex.IsMatch(exp,pMatch)) { foreach(MatchmatchinRegex.Matches(exp,pMatch)) { stringt
5、mp=match.Value; tmp=tmp.Substring(1,tmp.Length-2);//去掉"("和")" if(!Regex.IsMatch(tmp,exMatch))returnfalse; } exp=Regex.Replace(exp,pMatch,"0");//将最内层的括号及括号内表达式直接用一个0代替 } returnRegex.IsMa
6、tch(exp,exMatch); } #endregion 生成逆波兰表达式#region生成逆波兰表达式 /// ///获取逆波兰表达式。 /// /// /// publicstaticstringRpnExp(stringexp) { if(!IsRig
7、ht(exp))thrownewApplicationException("非法的中缀表达式。"); StackskOp=newStack();//定义操作符堆栈 StringBuilderrpn=newStringBuilder();//逆波兰表达式 char[]charExp=exp.ToCharArray();//将中缀表达式转换为char数组 stringdigit=string.Empty;//数字字符串 for(inti=0
8、;i
此文档下载收益归作者所有