中缀表达式(1)

83 阅读3分钟

“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

中缀表达式转换为后缀表达式

后缀表达式适合计算式进行运算,尤其是表达式很长的情况下,因此在开发中,需要将中缀表达式转成后缀表达式。

具体步骤如下:

1) 初始化两个栈:运算符栈s1和储存中间结果的栈s2;

2)从左至右扫描中缀表达式;

3)遇到操作数时,将其入栈s2;

4)遇到运算符时,比较其与s1栈顶运算符的优先级:

(1)如果s1为空,或栈顶运算符为左括号“(",则直接将此运算符入栈;

(2)否则,若优先级比栈顶运算符的高,也将运算符压入s1;

(3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4.1)与s1中新的栈顶运算符相比较;

5)遇到括号时:

(1)如果是左括号“(”,则直接压入s1

(2)如果是右括号“)",则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃

6)重复步骤2至5,直到表达式的最右边

7)将s1中剩余的运算符依次弹出并压入s2

8)依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式

测试代码:

        //完成将一个中缀表达式转换成后缀表达式的功能  
//        1.由于直接对str进行操作不方便,因此先将“1+((2+3)*4)-5”转换成中缀表达式对应的list  
//        即“1+((2+3)*4)-5”转换成ArrayList[1,+,(,(,2,+,3,),*,4,),-,5]  
        String expression="1+((2+3)*4)-5";  
        List<String> iNfixExpressionList = toINfixExpressionList(expression);  
        List<String> parseSuffixExpressionList = parseSuffixExpressionList(iNfixExpressionList);  
  
//        //先定义一个逆波兰表达式  
//        //(3+4)×5-6 所对应的 3 4 + 5 × 6 -  =>29  
//        //(30+4)×5-6 所对应的 3 4 + 5 × 6 -  =>164  
//        //为了方便表达式符号都要用空格隔开  
//        String suffixExpression="30 4 + 5 * 6 - ";  
//        List<String> list = getlistString(suffixExpression);  
        int res=calcluate(parseSuffixExpressionList);  
        System.out.println("计算的结果是="+res);  
    }  
    //将将“1+((2+3)*4)-5”转换成中缀表达式对应的list方法  
    public static List<String> toINfixExpressionList (String s){  
        List<String> ls=new ArrayList<String>();  
        int i=0; //这是一个表达式,用于遍历中缀表达式字符串  
        String str ;//做多位数的拼接  
        char c;//没遍历到一个字符,就放入到c中  
        do{//如果是一个非数字,就直接加入ls中  
            //str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符。  
            if((c=s.charAt(i))<48||(c=s.charAt(i))>57){  
                ls.add(""+c);  //还是在前面+""将字符变成字符串类型的数字  
                i++; //i需要后移  
            } else {  
                str="";//先对str进行赋初值的操作  
                //若是数字则需要进行拼接操作  
                while (i<s.length()&&(c=s.charAt(i))>=48&&(c=s.charAt(i))<=57){  
                    str+=c;  //拼接操作  
                    i++; //这里同时也是对一个个字符进行操作,也需要i+1  
                }  
                //然后再将拼合好的字符串放入list中  
                ls.add(str);  
            }  
        }while (i<s.length());  //若i的长度等于表达式的长度就结束运行  
        return ls;  
    }