中缀到后缀的转换
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;
}
}
转换成后缀表达式: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;
}
}
相关文章推荐
- 中缀表达式转换为后缀表达式
- [栈和队列]从中缀向后缀转换表达式
- 前缀、中缀、后缀表达式转换
- 中缀表达式转换为后缀表达式
- [栈和队列]从中缀向后缀转换表达式
- 前缀、中缀、后缀的相互转换
- 中缀到后缀表达式的转换
- 中缀表达式转换为后缀表达式的算法
- 前缀---中缀--后缀 表达式的相互转换
- 中缀表达式转换为后缀表示和前缀表达式的简单方法
- [栈和队列]从中缀向后缀转换表达式
- 重拾编程之路--数据结构--中缀表示法转换成后缀表示法
- PTA 表达式转换 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
- 数据结构之栈----PTA题目7-20表达式转换(中缀转后缀)
- 桶(基数)排序与stack的中缀与后缀的转换(C语言)
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现
- 4.从中缀向后缀转换表达式
- 表达式 中缀 后缀 转换
- 栈应用之将中缀数值表达式转换成后缀表达式
- 堆栈的应用(2) 中缀算术表达式到后缀(逆波兰记法reverse polish notation)的转换及其计算 C++实现