public class ExpressionEvaluator {
private ExpressionEvaluator()
{
}
/**
* 将算术表达式转换为逆波兰表达式
* @param expression 要计算的表达式,如"1+2+3+4"
* @return
*/
private static List parseExpression(String expression)
{
if(StringUtils.isEmpty(expression)){
return new ArrayList();
}
List listOperator = new ArrayList(10);
Stack stackOperator = new Stack();
ExpressionParser expParser = new ExpressionParser(expression);
ExpressionNode beforeExpNode = null; //前一个节点
ExpressionNode unitaryNode = null; //一元操作符
ExpressionNode expNode;
//是否需要操作数
boolean requireOperand = false;
while ((expNode = expParser.readNode()) != null)
{
if ( (expNode.getType() == ExpressionNodeType.Numeric) ||
(expNode.getType() == ExpressionNodeType.String) ||
(expNode.getType() == ExpressionNodeType.Date))
{
//操作数, 直接加入后缀表达式中
if (unitaryNode != null)
{
//设置一元操作符节点
expNode.setUnitaryNode(unitaryNode);
unitaryNode = null;
}
listOperator.add(expNode);
requireOperand = false;
continue;
}
else if (expNode.getType() == ExpressionNodeType.LParentheses)
{
//左括号, 直接加入操作符栈
stackOperator.push(expNode);
continue;
}
else if (expNode.getType() == ExpressionNodeType.RParentheses)
{
//右括号则在操作符栈中反向搜索,直到遇到匹配的左括号为止,将中间的操作符依次加到后缀表达式中。
ExpressionNode lpNode = null;
while (stackOperator.size() > 0)
{
lpNode = stackOperator.pop();
if (lpNode.getType() == ExpressionNodeType.LParentheses) break;
listOperator.add(lpNode);
}
if (lpNode == null || lpNode.getType() != ExpressionNodeType.LParentheses)
{
throw new ExpressionException(String.format("在表达式\"%s\"中没有与在位置(%s)上\")\"匹配的\"(%s)\"字符!", expParser.getExpression(), expParser.getPosition()));
}
}
else
{
if (stackOperator.size() == 0)
{
//第一个节点则判断此节点是否是一元操作符"+,-,!,("中的一个,否则其它都非法
if (listOperator.size() == 0 &&
!(expNode.getType() == ExpressionNodeType.LParentheses || expNode.getType() == ExpressionNodeType.Not))
{
//后缀表达式没有任何数据则判断是否是一元操作数
if (ExpressionNode.IsUnitaryNode(expNode.getType()))
{
unita