中缀式转后缀式工具类实现 (一)

2014-11-24 11:03:48 · 作者: · 浏览: 0

我们经常用到的表达式叫中缀式,如: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 priorities;

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