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

后缀表达式转中缀表达式

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

  • 写回答

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条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵