ITPub博客

首页 > IT职业 > IT生活 > 中缀表达式转为后缀表达式

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

IT生活 作者:tomorrowcome 时间:2021-09-09 08:57:02 0 删除 编辑

问题:输入一个式子3*(4+15)-6=?,输出结果
这个问题主要用到了栈解决,首先这个式子是中缀表达式,然后得转换成后缀表达式,然后再进行求值。因为对计算机来说,计算前缀或后缀表达式的值非常简单。
不明白什么是中缀表达式后缀表达式的同学看这里:

举例:
(3 + 4) × 5 - 6 就是中缀表达式

  • × + 3 4 5 6 前缀表达式
    3 4 + 5 × 6 - 后缀表达式

前缀、中缀、后缀表达式详细介绍

bug给我在图书馆里讲了一下具体实现的过程,对,我一个大四的学姐求着大二的学弟教我数据结构TAT。简单的说,就是先将一个表达式拆分出来,运算符放在一个栈里,操作数放在一个栈里,然后通过运算符优先往栈里压数据或弹出计算。
我这样说比较难懂,如果能画图的话就比较直观了
还是祭出代码吧,写得比较差劲,大家将就着看

主函数

public static void main(String[] args) {
        // TODO Auto-generated method stub
        Stack tr=new Stack();//存放符号的栈 
        Stack nd=new Stack();//存放操作数的栈
        char[] op=new char[]{'*','+','-','/','(',')','#'};//操作符数组
        tr.push('#');//#为起始符号
        System.out.println("请输入表达式(以#结束):");
        Scanner so=new Scanner(System.in);
        String s=so.next();
        int len=s.length();
        int i=0;
        while(i'://退栈并将运算结果入栈        
                        int b= Integer.parseInt(String.valueOf(nd.pop()));//强制转换为int型
                        int a=Integer.parseInt(String.valueOf(nd.pop()));
                        nd.push(operate(a,(char)tr.pop(),b));
                        break;
                }
            }
            }
        i++;
        }
        System.out.println("运算结果为:"+nd.peek());

    }

in方法,用于判断字符是不是操作符

public static boolean in(char c){
        char[] op=new char[]{'*','+','-','/','(',')','#'};//操作符数组
        for(int i=0;i

precede方法,用于判断运算符之间的优先级,返回优先关系

public static char precede(char a,char c){
        switch(a){
        case'+':
        case'-':
            switch(c){
            case'+':
            case'-':
            case')':
            case'#':
                return '>';
            case'*':
            case'/':
            case'(':
                return ''; 
            case'(':
                return '';
            case'(':
                return '0';
            }
        case'#':
            switch(c){
            case'+':
            case'-':
            case'(':
            case'*':
            case'/':
                return '

operate方法,用于进行二元计算,返回计算结果

    public static int operate(int a,char t,int b){
        switch(t){
        case'+':return (a+b);
        case'-':return (a-b);
        case'*':return (a*b);
        case'/':return (a/b);
        }
        return 0;
    } 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/875/viewspace-2798029/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-19

  • 博文量
    122
  • 访问量
    928