package algorithm;
import java.util.*;
public class ConvertMiddleOrder2PostOrder {
/*
*
* convert middleOrder math expression to PostOrde
* for example: A-B*(C+D)/E (in-order)
* converted result: ABCD*E/- (post-oder)
*/
public static String ConvertInOrder2PostOrderUtil(String inOrderString){
//support: + - * /
/* element content:
* l = <
* g = >
* e = =
* n = not available
* each operation map to array index:
* + = 0
* - = 1
* * = 2
* / = 3
* for example: oprPriority[2][3]=‘e', 就是 operator * 跟栈类的 /比较优先级,结果是优先级 相等。
* (, ),比较特殊,就在代码中处理了。
*/
char [][] oprPriority = new char[][]{
{'e','e','l','l'},
{'e','e','l','l'},
{'g','g','e','e'},
{'g','g','e','e'}
};
if(inOrderString.length()<3) {
System.out.println("bad expression data");
return null;
}
char[] resultarray = new char[inOrderString.length()];
int rstindex=0;
int len=inOrderString.length();
int curposition=0;
//save operators
Stack<String> mystack = new Stack<String>();
char[] tmparray = new char[2];
char stackchar,curchar;
while(len>0){
System.out.println("converted str="+new String(resultarray));
curchar=inOrderString.charAt(curposition);
switch(curchar) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
resultarray[rstindex++]=curchar;
curposition++;
len--;
break;
case '+':
case '-':
case '*':
case '/':
if(!mystack.empty()){
//compare operation
tmparray=mystack.peek().toCharArray();
if(tmparray[0]=='(') {
//push this operator as '(' in stack is lowest
tmparray[0]=curchar;
mystack.push(new String(tmparray));
curposition++;
len--;
} else {
int column,row;
switch(curchar){
case '+':
row=0;
break;
case '-':
row=1;
break;
case '*':
row=2;
break;
case '/':
row=3;
break;
default:
System.out.println("expression error");
return null;
}
switch(tmparray[0]){
case '+':
column=0;
break;
case '-':
column=1;
break;
case '*':
column=2;
break;
case '/':
column=3;
break;
default:
System.out.println("expression error");
return null;
}
char result=oprPriority[row][column];
switch(result){
case 'g': // incoming > operator in stack
//push this operator if it is higher than stack top
tmparray[0]=curchar;
mystack.push(new String(tmparray));
curposition++;
len--;
break;
case 'e': //=
case 'l': // <
//pop up the top operator in stack
mystack.pop();
resultarray[rstindex++]=tmparray[0];
break;
default:
System.out.println("expression error");
return null;
}
}
} else {
//push this operator
tmparray[0]=curchar;
mystack.push(new String(tmparray));
curposition++;
len--;
}
break;
case '(':
//push into stack
tmparray[0]=curchar;
mystack.push(new String(tmparray));
curposition++;
len--;
break;
case ')':
//pop up all operator until it meet '('
while(!mystack.empty()){
tmparray=mystack.peek().toCharArray();
mystack.pop();
if(tmparray[0]=='('){
break;
} else {
//save this operator to result str
resultarray[rstindex++]=tmparray[0];
}
}
curposition++;
len--;
break;
default:
System.out.println("expression error");
return null;
}
}
while(!mystack.empty()) {
tmparray=mystack.pop().toCharArray();
resultarray[rstindex++]=tmparray[0];
System.out.println("converted str="+new String(resultarray));
}
String result=new String(resultarray);
return result;
}
}
测试语句:
ConvertMiddleOrder2PostOrder.ConvertInOrder2PostOrderUtil("1-2*(3+4)/5"))
//output is
converted post-order expression is: 1234+*5/-