java 用于评估后缀表达式的程序导致 leetcode #150 中的一种方法出现数字格式异常,请更改 stack.Suggest

java program for evaluating postfix expression results in numberformat exception in one of the methods leetcode #150 for stack.Suggest changes please

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 时出现数字格式异常。我是 java.

的新手

您的代码的问题是 isoperand returns 仅当数字介于 0 和 9 之间时才为真,但事实并非如此。我们也有大于 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 提交