用于评估后缀表达式的 java 程序在 leetcode #150 for stack 的一种方法中导致 numberformat 异常。请建议更改

Posted

技术标签:

【中文标题】用于评估后缀表达式的 java 程序在 leetcode #150 for stack 的一种方法中导致 numberformat 异常。请建议更改【英文标题】:java program for evaluating postfix expression results in numberformat exception in one of the methods leetcode #150 for stack.Suggest changes please 【发布时间】:2021-09-06 23:00:26 【问题描述】:
class Solution 
     public boolean isoperand(String ch)
        
            return(Integer.parseInt(ch)>=0 && Integer.parseInt(ch)<=9) ;
             
        
     public int operate(String ch,int a,int b)
        
            switch(ch)
                case "*":return a*b;
                case "/":return a/b;
                case "+":return a+b;
                case "-":return a-b;
                
            
         return 0;
        
    public int evalRPN(String[] tokens) 
    Stack<String> st=new Stack<>();
       
       
        int l=tokens.length;
        for(int i=0;i<l;i++)
        
            if(isoperand(tokens[i]))
                st.push(tokens[i]);
            else
                int b=Integer.parseInt(st.pop());
                int a=Integer.parseInt(st.pop());
                int result=operate(tokens[i],a,b);
                st.push(Integer.toString(result));
            
            
            
        
        
        
            int temp=Integer.parseInt(st.pop());
        
        return temp;
        
    

这是我在堆栈中实现后缀表达式求值的程序。 谁能帮我?执行方法 isoperand 时出现 numberformat 异常。我对 java 还很陌生。

【问题讨论】:

parseInt 仅适用于有效整数,因此在isoperand 中使用,它对于确定某物是否为有效整数是无用的。要么重写它以使用其他方式来检查整数,要么捕获异常。 但如果你想坚持原来的方法,你可以使用ch.charAt(0)&gt;='0' &amp;&amp; ch.charAt(0)&lt;='9'。不过,您仍然需要检查 ch 实际上是一个字符串。 【参考方案1】:

您的代码的问题是 isoperand 仅在数字介于 0 和 9 之间时才返回 true,但事实并非如此。我们也有大于 9 的数字。因此它会导致 RuntimeError。 因此,最好检查当前令牌是否为operator,如果不是,则它必须是operand。 我使用了一个集合来有效地检查当前令牌是否是一个运算符,方法是将所有运算符添加到集合中:+-*/。 这是您的代码的改进版本:

class Solution

    public int operate(String ch, int a, int b)
    
        switch (ch)
        
            case "*": return a*b;
            case "/": return a/b;
            case "+": return a+b;
            case "-": return a-b; 
        
        return 0;
    
    public int evalRPN(String[] tokens)
    
        Set<String> operators = new HashSet<>();
        operators.add("*"); operators.add("/");
        operators.add("+"); operators.add("-");
        
        Stack<String> stack = new Stack<>();
        int len = tokens.length;
        for (int i=0; i<len; i++)
        
            if (operators.contains(tokens[i]))
            
                int b = Integer.parseInt(stack.pop());
                int a = Integer.parseInt(stack.pop());
                int result = operate(tokens[i], a, b);
                stack.push(Integer.toString(result));
            
            else
                stack.push(tokens[i]);
        
        return Integer.parseInt(stack.pop());
    

运行时间:4 毫秒,比 88.95% 的 Java 提交速度快

【讨论】:

以上是关于用于评估后缀表达式的 java 程序在 leetcode #150 for stack 的一种方法中导致 numberformat 异常。请建议更改的主要内容,如果未能解决你的问题,请参考以下文章

Java | 在 Java 中执行动态表达式语句: 前中后缀SpELOGNLGroovyJexl3

Scala中的“评估”

书写表达式:中缀、后缀和前缀

评估前缀表达式的算法?

leetc5211今天通过一题单点最短路径学到了点东西

20172315『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结