中缀表达式到逆波兰表达式的转换及求值
最近要写一个工资管理软件,不可避免的要用到公式的定义及求值等问题。对于数学表达式的计算,虽然也有直接对表达式进行扫描并按照优先级逐步计算的方法,但感觉还是不如将中缀表达式转换为逆波兰表达式更容易处理。
使用逆波兰表达式,则有以下几件工作需要去做:
1.对中缀表达式进行语法分析,或称合法性检查。
2.将中缀表达式转换为逆波兰表达式。
3.计算逆波兰表达得到我们想要的值。
以下是我为实现该功能而写的一个简单的类:
using System;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;

namespace Seaking
{
public class RpnExpression
{
检查中缀表达式的合法性数字
string exMatch=@"^0([-+*/]0)*$";//匹配无括号的、用0替换所有的数字后的表达式
exp=Regex.Replace(exp,numberMatch,"0");//为简化检测,用0替换所有的数字
while(Regex.IsMatch(exp,pMatch))
{
foreach(Match match in Regex.Matches(exp,pMatch))
{
string tmp=match.Value;
tmp=tmp.Substring(1,tmp.Length-2);//去掉 "("和 ")"
if(!Regex.IsMatch(tmp,exMatch)) return false;
}
exp=Regex.Replace(exp,pMatch,"0");//将最内层的括号及括号内表达式直接用一个0代替
}

return Regex.IsMatch(exp,exMatch);
}
#endregion

生成逆波兰表达式

计算逆波兰表达式的值
}
}
由于只是工资计算,该类只支持+-×/ 四种运算,而且不支持负数(太麻烦,呵呵),有兴趣的朋友可以自己扩充一下。
使用逆波兰表达式,则有以下几件工作需要去做:
1.对中缀表达式进行语法分析,或称合法性检查。
2.将中缀表达式转换为逆波兰表达式。
3.计算逆波兰表达得到我们想要的值。
以下是我为实现该功能而写的一个简单的类:
using System;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
namespace Seaking
{
public class RpnExpression
{
检查中缀表达式的合法性数字
string exMatch=@"^0([-+*/]0)*$";//匹配无括号的、用0替换所有的数字后的表达式
exp=Regex.Replace(exp,numberMatch,"0");//为简化检测,用0替换所有的数字
while(Regex.IsMatch(exp,pMatch))
{
foreach(Match match in Regex.Matches(exp,pMatch))
{
string tmp=match.Value;
tmp=tmp.Substring(1,tmp.Length-2);//去掉 "("和 ")"
if(!Regex.IsMatch(tmp,exMatch)) return false;
}
exp=Regex.Replace(exp,pMatch,"0");//将最内层的括号及括号内表达式直接用一个0代替
}
return Regex.IsMatch(exp,exMatch);
}
#endregion
生成逆波兰表达式
计算逆波兰表达式的值
}
}由于只是工资计算,该类只支持+-×/ 四种运算,而且不支持负数(太麻烦,呵呵),有兴趣的朋友可以自己扩充一下。



浙公网安备 33010602011771号