您的位置:首页 > 其它

中缀到后缀的转换

2012-06-26 16:45 211 查看
中缀表达式:a+b*c+(d*e+f)*g

转换成后缀表达式:abc*+de*f+g*+

转换步骤:

当读到一个操作数(如:a)时,立即把它放到输出中;

当遇到操作符(如:+)时,将其放入栈中;

当遇到右括号时,弹出栈元素直至遇到左括号。将左括号弹出但不输出;

如果遇到其他操作符[ +, * , (  ] ,那么弹出栈中的元素直到发现优先级更低的元素为止。有一个例外,除非是处理一个
) 的时候,否则绝不从栈中移走 ( 。

完整的代码:

import java.util.Stack;

/**
* 中缀到后缀的转换
* @author GongQiang
*
*/
public class MiddleToPostExpression {

private Stack<Character> stack = new Stack<Character>();
/**
* @param args
*
* Date :2012-6-26
* Author :GongQiang
*/
public static void main(String[] args) {
String middleExp = "a+b*c+(d*e+f)*g";
MiddleToPostExpression mtpe = new MiddleToPostExpression();
System.out.println( mtpe.transform(middleExp) );
}

public String transform( String middleExp ){
StringBuilder sb = new StringBuilder( middleExp.length() );
for( int i=0 ; i<middleExp.length() ; i++ ){
char c = middleExp.charAt( i );

if( operandChar( c ) ){

//空栈-->立即插入
if( stack.isEmpty() && !rightBracket(c) ){
stack.push( c );
}
// 操作符级别高 || 栈顶元素是'('
else if( getLevel(c) > getLevel( stack.peek() ) || leftBracket( stack.peek() ) ){
stack.push( c );
}
// 当前元素不是')' && 级别比栈顶元素低 && 栈顶元素不是')'
else if( !rightBracket(c) && getLevel(c) <= getLevel( stack.peek() ) && !leftBracket( stack.peek() )){
while( !stack.isEmpty() && getLevel(c) <= getLevel( stack.peek() ) && !leftBracket( stack.peek() ) ){
sb.append( stack.pop() );
}

stack.push( c );
}
// 当前元素是')'
else if( rightBracket( c ) ){
while( !leftBracket( stack.peek() ) ){
sb.append( stack.pop() );
}
stack.pop(); //弹出 '('

}

}
else{
sb.append( c );
}
}

//弹出栈中剩下的元素
while( !stack.isEmpty() ){
sb.append( stack.pop() );
}
return sb.toString();
}

/**
* 是操作符 ?
* @return
*
* Date :2012-6-26
* Author :GongQiang
*/
private boolean operandChar( char c ){
char[] operands = { '+', '*', '(', ')' };
for( char op : operands ){
if( c == op ){
return true;
}
}
return false;
}

private boolean leftBracket( char c ){
return c == '(' ? true : false;
}

private boolean rightBracket( char c ){
return c == ')' ? true : false;
}

private int getLevel( char c ){
if( c == '+' ){
return 1;
}
if( c == '*' ){
return 2;
}

if( c == '(' ){
return 1024;
}

// 右括号
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string c date import class