我们经常用到的表达式叫中缀式,如:1+2,a+b*c;
还有另外一种表达式叫后缀式,叫逆波兰式。
原理我就不赘述了,网上很多介绍。
现在写了个Java中缀式转后缀式的工具类,现分享源码如下:
操作符常量接口:
[java] /**
*
* 操作符常量接口:主要为了保存常量
*
* @author dobuy
* 修改时间: 2013-5-22
*
*/
public interface Operators
{
/**
* 操作符优先级:高
*/
int HIGH_PRIORITY = 10;
/**
* 操作符优先级:中
*/
int MIDIUM_PRIORITY = 5;
/**
* 操作符优先级:低
*/
int LOW_PRIORITY = 1;
/**
* 错误(或未知)的操作符
*/
int ERROR_PRIORITY = -1;
char OPEN_BRACKET = '(';
char CLOSE_BRACKET = ')';
char ADD = '+';
char SUBRACTION = '-';
char MULTIPLITICATION = '*';
char DIVISION = '/';
char COMPLIMENT = '%';
char SPACE = ' ';
char ZERO = '0';
char NINE = '9';
char LOWER_CASE_A = 'a';
char LOWER_CASE_Z = 'z';
char UPPER_CASE_A = 'A';
char UPPER_CASE_Z = 'Z';
String EMPTY = "";
/**
* 表达式中待过滤的字符(正则表达式中用到,需转义),下同;
*/
String OPEN_SQUARE_BRACKET = "\\[";
String CLOSE_SQUARE_BRACKET = "\\]";
String OPEN_CURLY_BRACE = "\\{";
String CLOSE_CURLY_BRACE = "\\}";
}
/**
*
* 操作符常量接口:主要为了保存常量
*
* @author dobuy
* 修改时间: 2013-5-22
*
*/
public interface Operators
{
/**
* 操作符优先级:高
*/
int HIGH_PRIORITY = 10;
/**
* 操作符优先级:中
*/
int MIDIUM_PRIORITY = 5;
/**
* 操作符优先级:低
*/
int LOW_PRIORITY = 1;
/**
* 错误(或未知)的操作符
*/
int ERROR_PRIORITY = -1;
char OPEN_BRACKET = '(';
char CLOSE_BRACKET = ')';
char ADD = '+';
char SUBRACTION = '-';
char MULTIPLITICATION = '*';
char DIVISION = '/';
char COMPLIMENT = '%';
char SPACE = ' ';
char ZERO = '0';
char NINE = '9';
char LOWER_CASE_A = 'a';
char LOWER_CASE_Z = 'z';
char UPPER_CASE_A = 'A';
char UPPER_CASE_Z = 'Z';
String EMPTY = "";
/**
* 表达式中待过滤的字符(正则表达式中用到,需转义),下同;
*/
String OPEN_SQUARE_BRACKET = "\\[";
String CLOSE_SQUARE_BRACKET = "\\]";
String OPEN_CURLY_BRACE = "\\{";
String CLOSE_CURLY_BRACE = "\\}";
}
表达式工具类
[java] import java.util.HashMap;
import java.util.Map;
/**
*
* 操作符处理工具类
*
* @author dobuy
* 修改时间: 2013-5-22
*
*/
public final class OperatorUtils
{
/**
* 保存所有操作符(Key)及优先级(Value)
*/
private static final Map
private OperatorUtils()
{
}
/**
* 类加载时初始化
*/
static
{
priorities = new HashMap
getPriorities().put(Operators.OPEN_BRACKET, Operators.HIGH_PRIORITY);
getPriorities().put(Operators.MULTIPLITICATION, Operators.MIDIUM_PRIORITY);
getPriorities().put(Operators.DIVISION, Operators.MIDIUM_PRIORITY);
getPriorities().put(Operators.COMPLIMENT, Operators.MIDIUM_PRIORITY);
getPriorities().put(Operators.ADD, Operators.LOW_PRIORITY);
getPriorities().put(Operators.SUBRACTION, Operators.LOW_PRIORITY);
}
/**
*
* 字符是否是操作符(除了字母和数字都是操作符)
*
* @param ch
* @return
* @author dobuy
* 修改时间: 2013-5-22
*/
public static boolean isOperator(char ch)
{
return !isCharacter(ch) && !isNumber(ch);
}
/**
*
*
* ch1的优先级是否不高于ch2
*
* @param ch1
* @param ch2
* @return