- /*
- *
- * 中序式轉後序式
- *
- *
- */
- public class InFixToPosfix {
- static int priority(char op){ //順序 *,/ > +,-
- if(op == '+' || op == '-')
- return 1 ;
- else if(op == '*' || op == '/')
- return 2 ;
- else
- return 0 ;
- }
- public static void main(String[] args){
- String infix = "(A+B)*D+E/(F+A*D)+C";
- //a+b*d+c/d , (A+B)*D+E/(F+A*D)+C
- System.out.println("後序式為 :" +ToPosfix(infix.toCharArray()));
- String Posfix = ToPosfix(infix.toCharArray());
- System.out.println("中序式為 :" +ToInFix(Posfix.toCharArray()));
- }
- static String ToPosfix(char[] infix){
- char[] stack = new char[infix.length]; //堆疊
- StringBuffer Posfix = new StringBuffer(); //輸出:後序式
- char[] Infix = infix;
- int top = 0;
- for(char op : Infix){
- if(op == '+'|| op == '-'||op == '*' || op == '/'){
- while( priority(stack[top]) >= priority(op)){
- Posfix.append(stack[top]);
- top--;
- }
- if(top < stack.length){
- top++ ;
- stack[top] = op;
- }
- }else if(op == '('){
- if(top < stack.length ){
- top++ ;
- stack[top] = op;
- }
- }else if(op == ')'){
- while(stack[top] != '('){
- Posfix.append(stack[top]);
- top--;
- }
- top--;// ( 不輸出
- }else{
- Posfix.append(op) ;
- }
- }
- while(top > 0){
- Posfix.append(stack[top]);
- top--;
- }
- return Posfix.toString();
- }
- static String ToInFix(char[] posfix){
- String[] stack = new String[posfix.length]; //運算式堆疊
- StringBuffer InFix = new StringBuffer(); //輸出:中序式
- char[] Posfix = posfix;
- int top = 0;
- for(char op : posfix){ // stack 1 + op + stack 2
- if(op == '+'|| op == '-'||op == '*' || op == '/'){
- String s = stack[top] ;
- stack[top] = null ;
- String s2 = stack[--top] ;
- if(op == '+'|| op == '-')
- stack[top] = "("+s2+op+s+")";
- else
- stack[top] = s2+op+s;
- }else{
- top++;
- stack[top] =String.valueOf(op) ;
- }
- }
- for(String s : stack){
- if(s != null)
- InFix.append(s);
- }
- return InFix.toString();
- }
- }
2017年7月29日 星期六
(JAVA)(資料結構)中序式轉後序式(轉回中序式)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。