1. 程式人生 > >中綴表達式轉後綴並計算(只考慮個位整數,不考慮除0等情況)

中綴表達式轉後綴並計算(只考慮個位整數,不考慮除0等情況)

sta put AS res r+ ring 位置 while AC

中綴轉後綴

public class 中綴轉後綴 {
    static char[] res;//存儲結果
    static int len_r=0;

    static char[] stack;//操作符棧
    static int len_s=0;

    public static String transfer(String s){
        res=new char[s.length()];
        stack=new char[s.length()];

        char[] ch=s.toCharArray();

        for(int i=0;i<ch.length;++i){
            //數字直接輸出到結果
            if(ch[i]>=‘0‘&&ch[i]<=‘9‘){
                res[len_r++]=ch[i];
            }else{
                //右括號:操作符出棧輸出到結果,直到遇到左括號(左括號出棧但不輸出到結果)
                if(ch[i]==‘)‘){
                    while(len_s>0&&stack[--len_s]!=‘(‘){
                        res[len_r++]=stack[len_s];
                    }
                }else{
                    //左括號直接進操作符棧
                    if(ch[i]==‘(‘){
                        stack[len_s++]=ch[i];
                    }else{
                        //操作符出棧輸出到結果,直到遇到自己的位置。
                        int index=getIndex(ch[i]);
                        while(len_s>index){
                            res[len_r++]=stack[--len_s];
                        }
                        stack[len_s++]=ch[i];
                    }
                }
            }
        }
        while(--len_s>=0){
            res[len_r++]=stack[len_s];
        }
        return new String(res,0,len_r);
    }
    /*
    * 如果是*或/,遇到(、+、-、空 進棧
    * 如果是+或-,遇到(、空 進棧
    * */
    static int getIndex(char ch){
        int index=0;
        boolean flag=true;
        if(ch==‘+‘||ch==‘-‘){
            flag=false;
        }
        for(int i=len_s-1;i>=0;--i){
            if(flag&&(stack[i]==‘(‘||stack[i]==‘+‘||stack[i]==‘-‘)){
                index=i+1;
                break;
            }
            if(!flag&&stack[i]==‘(‘){
                index=i+1;
                break;
            }
        }
        return index;
    }
}

  計算後綴表達式

public class 計算後綴表達式 {
    public static int doCompute(String s){
        char[] ch=s.toCharArray();
        int[] stack=new int[s.length()];
        int len=0;
        for(int i=0;i<ch.length;++i){
            //數字進棧;遇到操作符ch,出棧兩個數a,b(a先出),把b ch a的結果進棧。最後輸出棧頂元素。
            if(ch[i]>=‘0‘&&ch[i]<=‘9‘){
                stack[len++]=ch[i]-‘0‘;
            }else{
                int a=stack[--len];
                int b=stack[--len];
                stack[len++]=compute(a,b,ch[i]);
            }
        }
        return stack[0];
    }
    static int compute(int b,int a,char ch){
        int res=0;
        switch(ch){
            case ‘+‘:
                res=a+b;
                break;
            case ‘-‘:
                res=a-b;
                break;
            case ‘*‘:
                res=a*b;
                break;
            case ‘/‘:
                res=a/b;
                break;
        }
        return res;
    }
}

  

中綴表達式轉後綴並計算(只考慮個位整數,不考慮除0等情況)