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 提交
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 提交