为了账号安全,请及时绑定邮箱和手机立即绑定

在java中逆波兰到中缀表示法优化

在java中逆波兰到中缀表示法优化

慕森卡 2021-08-25 15:35:20
我正在尝试解决一个涉及将反向波兰表示法转换为中缀表示法的编程挑战。例如: 1 3 + 2 4 5 - + / 将是: ((1+3)/(2+(4-5))) 我的解决方案到目前为止确实有效,但速度不够快。所以我正在寻找任何优化建议。public class betteralgo {    public static void main(String[] args) throws IOException {        BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));        String line = bi.readLine();        String[] input = line.split(" ");        StringBuilder builder = new StringBuilder();        Stack<String> stack = new Stack<String>();        for(String e:input) {            switch(e){                case("+"):                case("-"):                case("*"):                case("/"):                    String i = stack.pop();                String k = stack.pop();                stack.push("(" + k + e + i + ")");                break;                default:                    stack.push(e);                }            }        System.out.println(stack.pop());                }           }
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

只是出于好奇,这个递归解决方案会更快吗?


public static void main(String[] args)

{

    String input = "1 3 + 2 4 5 - + /";

    List<String> terms = new ArrayList<>(Arrays.asList(input.split(" ")));      

    String result = build(terms);

    System.out.println(result);

}


static String build(List<String> terms)

{

    String t = terms.remove(terms.size()-1);        

    if("+-/*".indexOf(t) >= 0)

    {

        String op2 = build(terms);

        String op1 = build(terms);

        return "(" + op1 + t + op2 + ")";

    }

    else return t;

}


查看完整回答
反对 回复 2021-08-25
?
Qyouu

TA贡献1786条经验 获得超11个赞

由于使用越来越长的表达式,您的问题是二次复杂性。解决办法是建一棵树。而不是

"(" + k + e + i + ")"

创建一个包含内容e和子节点的新节点k以及i. 然后通过树的简单传递允许您生成任何表示(中缀、前缀或后缀)。


查看完整回答
反对 回复 2021-08-25
  • 3 回答
  • 0 关注
  • 204 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信