千峰翠色 2017-02-08 03:30 采纳率: 25%
浏览 4664
已采纳

后缀表达式转中缀表达式

求后缀表达式转中缀表达式的代码,请各位大神用栈来解,其他的如树等太过高深,蒟蒻一只不会用。拜托拜托!感激不尽!

  • 写回答

2条回答 默认 最新

  • Al_assad 2017-02-08 05:08
    关注

    从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。

    例如后缀表达式 “3 4 + 5 × 6 -”:
    (1) 从左至右扫描,将 3和4 压入堆栈;
    (2) 遇到 +运算符,因此弹出4和 3(4 为栈顶元素, 3为次顶元素,注意与前缀表达式做比较),计算出 3+4的值,得7 ,再将7入栈;
    (3) 将5入栈;
    (4) 接下来是 ×运算符,因此弹出5和 7,计算出7×5=35 ,将35入栈;
    (5) 将6入栈;
    (6) 最后是 -运算符,计算出35-6的值,即 29,由此得出最终结果。

    
    //  计算后缀表达式的结果
    
        public static int toValue(StringBuffer postfix){
            Stack<Integer> stack = new Stack<Integer>();
    
    
            for(int i=0;i<postfix.length();i++){
                char ch = postfix.charAt(i);
                if(ch>='0' && ch<='9'){
                    String value ="";
                    while(ch!= ' '){
                        value += ch;
                        ch = postfix.charAt(++i);
                    }
                    stack.push(Integer.parseInt(value));
                }
                else{
                    if(ch!= ' '){
                        int y = stack.pop();
                        int x = stack.pop();
                        switch(ch){
                        case '+':stack.push(x+y); break;
                        case '-': stack.push(x-y) ; break;
                        case '*': stack.push(x*y); break;
                        case '/' : stack.push(x/y);break;
                        }
                    }
                }
            }
            return stack.pop();
        }
    

    如果只是为了将后缀表达式转为中缀表达式,在以上流程中将出栈的数值和符号按照中缀表达式的格式打印出来(或储存为字符串就可以了);

    //后缀表达式转化为中缀表达式
     public static String postfixToInfix(StringBuilder postfix){
    
            Stack<String> stack = new Stack<String>();  //记录操作数
            char sign;    //记录前一个操作码
    
            for(int i=0;i<postfix.length();i++){
                char ch = postfix.charAt(i);
    
                if(ch>='0' && ch<='9'){
                    String value ="";
                    while(ch!= ' '){
                        value += ch;
                        ch = postfix.charAt(++i);
                    }
                    stack.push(value);
                }
                else{
                    if(ch!= ' '){
                        String y = stack.pop();   //两个操作数出栈
                        String x = stack.pop();
    
                        if((ch == '*' || ch == '/') && (sign == '+' || sign == '-')){   
                            stack.push("("+x+")"+ch+y);
                        }else{
                            stack.push(x+ch+y)
    
                        }
                        sign = ch;
                        }
                    }
                }
            }
            return stack.pop();
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 求一下解题思路,完全不懂。
  • ¥30 关于#硬件工程#的问题:求一下解题思路
  • ¥15 运筹学对偶单纯行法构造扩充问题
  • ¥20 XP系统的老电脑一开机就提示找不到rundll.exe,付费求解
  • ¥15 milvus查询出来的score怎么转换成0-1之间的相似性
  • ¥15 多ip服务器站群如何搭建l2tp服务器
  • ¥15 lvgl V9移植到linux开发板
  • ¥15 VB.net中在窗体中创建一个button控件来关闭窗体,但是提示错误,我该怎么办
  • ¥15 网上下载好的程序但是arduinoIDE编程报错,运行不了,哪里出错了,能具体给改一下吗
  • ¥15 Sharepoint JS开发 付费技术指导