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

2014-11-24 11:03:48 · 作者: · 浏览: 13
*
*/
private static void popUntilLowerTop(char ch)
{
while (isLowerThanTop(ch))
{
addCharToResult(operators.pop());
}
operators.push(ch);
}

/**
*
*

* 把解析好的字符加入输出结果中
*
* @param ch
*

*/
private static void addCharToResult(char ch)
{
// 结果不为空时,同时不连续为非操作符时,加空格后再加字符
if (OperatorUtils.isOperator(ch) || OperatorUtils.isOperator(lastElement))
{
result.append(Operators.SPACE);
}
result.append(ch);
}

/**
*

* 表达式解析完毕,依次从栈顶弹出操作符
*
*

*/
private static void popAllOperators()
{
while (!operators.isEmpty())
{
addCharToResult(operators.pop());
}
}
}

import java.util.Stack;

/**
*


* 中缀表达式变后缀表达式工具类
*
* @author dobuy
* 修改时间: 2013-5-22
*

*/
public final class SuffixExpressionUtils
{
/**
* 保存表达式中操作符的栈
*/
private static final Stack operators = new Stack();

/**
* 表达式的输出结果
*/
private static final StringBuilder result = new StringBuilder();

private static char lastElement;

/**
* 私有化构造方法,避免被实例化 <默认构造函数>
*/
private SuffixExpressionUtils()
{
}

/**
*
*

* 把中缀式变后缀表达式
*
* @param exp
* @return
*

*/
public static String getSuffixExp(String exp)
{
if (exp == null || exp.length() == 0)
{
return exp;
}

init();

// 所有{}[]全部替换成对应的小括号
exp = exp.replaceAll(Operators.OPEN_CURLY_BRACE, Operators.OPEN_BRACKET + Operators.EMPTY);
exp = exp.replaceAll(Operators.CLOSE_CURLY_BRACE, Operators.CLOSE_BRACKET + Operators.EMPTY);
exp = exp.replaceAll(Operators.OPEN_SQUARE_BRACKET, Operators.OPEN_BRACKET + Operators.EMPTY);
exp = exp.replaceAll(Operators.CLOSE_SQUARE_BRACKET, Operators.CLOSE_BRACKET + Operators.EMPTY);

// 去掉表达式中所有的" "
exp = exp.replaceAll(Operators.SPACE + Operators.EMPTY, Operators.EMPTY);

char[] characters = exp.toCharArray();

for (char ch : characters)
{
// 如果不是操作符,直接添加
if (!OperatorUtils.isOperator(ch))
{
addCharToResult(ch);
}
// 如果是')',则从操作符栈中压出操作符,直到'('为止
else if (ch == Operators.CLOSE_BRACKET)
{
popUntilOpenBracket();
}
// 如果是'('或者操作符的优先级高于栈顶元素(如果栈顶时'('时,做特殊处理)
else if (ch == Operators.OPEN_BRACKET || !isLowerThanTop(ch))
{
operators.push(ch);
}
// 如果优先级不高于栈顶元素时,栈顶元素出栈,直到栈顶元素优先级高于待入栈元素,并把待入栈元素入栈
else
{
popUntilLowerTop(ch);
}
lastElement = ch;
}

popAllOperators();
return result.toString().trim();
}

/**
*
*

* 由于定义的是静态方法,执行前,先清空操作符栈中的内容,避免受上一次的干扰
*
*

*/
private static void init()
{
operators.clear();
result.delete(0, result.length());
}

/**
*
*

* 碰到')'时,从操作符栈中弹出操作符,直到'('为止
*
*

*/
private static void popUntilOpenBracket()
{
char lastElement = operators.lastElement();

while (lastElem