用于评估后缀表达式的 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)>='0' && ch.charAt(0)<='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 异常。请建议更改的主要内容,如果未能解决你的问题,请参考以下文章