Java 在修复表达式求值中-发现NoSuchelementException
我的任务是计算从文件中读入的表达式,例如(4-7)/2+6分别表示最小值和最大值,其优先级高于/和* 但是,在尝试计算表达式时,我得到了一个NoSuchElementFound异常,它指向我在evaluate方法末尾返回的堆栈。我假设这意味着堆栈是空的。我看不出问题出在哪里。这是我的评估代码。重要的是,我已经实现了自己的堆栈类(两个字符串),并且没有使用泛型Java 在修复表达式求值中-发现NoSuchelementException,java,parsing,stack,expression,evaluate,Java,Parsing,Stack,Expression,Evaluate,我的任务是计算从文件中读入的表达式,例如(4-7)/2+6分别表示最小值和最大值,其优先级高于/和* 但是,在尝试计算表达式时,我得到了一个NoSuchElementFound异常,它指向我在evaluate方法末尾返回的堆栈。我假设这意味着堆栈是空的。我看不出问题出在哪里。这是我的评估代码。重要的是,我已经实现了自己的堆栈类(两个字符串),并且没有使用泛型 /** * Evaluates the expression and updates textArea appropriately *
/**
* Evaluates the expression and updates textArea appropriately
*/
private String evaluateLine()
{
char token;
String[] tokens = new String[expression[0].length()];
for(int i = 0; i < expression[0].length(); i++)
{
token = expression[0].charAt(i);
tokens[i] = String.valueOf(token);
}
OperatorStack operators = new OperatorStack();
IntegerStack integers = new IntegerStack();
for(int i = 0; i < tokens.length; i++)
{
if(isInteger(tokens[i]))
{
integers.push(tokens[i]);
}
else if(tokens[i] == "(")
{
operators.push(tokens[i]);
}
else if(tokens[i] == ")")
{
while(operators.top() != "(")
{
integers.push(applyOp(operators.pop(), integers.pop(), integers.pop()));
operators.pop();
}
}
else if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/"
|| tokens[i] == "<" || tokens[i] == ">")
{
while(!operators.isEmpty() && hasPrecedence(tokens[i], operators.top(), operators.top()))
{
integers.push(applyOp(operators.pop(), integers.pop(), integers.pop()));
}
operators.push(tokens[i]);
}
}
while(!operators.isEmpty())
{
integers.push(applyOp(operators.pop(), integers.pop(), integers.pop()));
}
return integers.pop();
}
public static boolean hasPrecedence(String op1, String op2, String op3)
{
if(op2 == "(" || op2 == ")")
{
return false;
}
if((op1 == "<" || op1 == ">") && (op2 == "*" || op2 == "/") && (op3 == "+" || op3 == "-"))
{
return false;
}
else
{
return true;
}
}
public static String applyOp(String op, String b, String a)
{
switch (op)
{
case "+":
return Integer.toString(Integer.parseInt(a) + Integer.parseInt(b));
case "-":
return Integer.toString(Integer.parseInt(a) - Integer.parseInt(b));
case "*":
return Integer.toString(Integer.parseInt(a) * Integer.parseInt(b));
case "/":
if(Integer.parseInt(b) == 0)
{
throw new
UnsupportedOperationException("Cannot divide by 0");
}
return Integer.toString(Integer.parseInt(a) / Integer.parseInt(b));
case "<":
if(Integer.parseInt(a) < Integer.parseInt(b))
{
return b;
}
else if(Integer.parseInt(b) < Integer.parseInt(a))
{
return a;
}
case ">":
if(Integer.parseInt(a) > Integer.parseInt(b))
{
return a;
}
else if(Integer.parseInt(b) > Integer.parseInt(a))
{
return b;
}
}
return Integer.toString(0);
}
public boolean isInteger(String str)
{
return str.matches("0123456789");
}
/**
*计算表达式并适当更新textArea
*/
私有字符串evaluateLine()
{
字符标记;
String[]标记=新字符串[表达式[0].length()];
对于(int i=0;i<表达式[0]。长度();i++)
{
token=表达式[0]。字符(i);
令牌[i]=String.valueOf(令牌);
}
运算符堆栈运算符=新运算符堆栈();
IntegerStack integers=新IntegerStack();
for(int i=0;iInteger.parseInt(b))
{
返回a;
}
else if(Integer.parseInt(b)>Integer.parseInt(a))
{
返回b;
}
}
返回整数.toString(0);
}
公共布尔值isInteger(字符串str)
{
返回str.matches(“0123456789”);
}
很难找到确切的问题,因为您没有包含足够的代码来编译示例,但我注意到,isInteger
方法不起作用。当我将输入运行到您的方法时,它为整数生成了一个空堆栈。请改用此方法:
public boolean isInteger(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException ex) {
return false;
}
}
或者,我认为您试图使用正则表达式来确定字符串是否包含整数。为此,您需要执行以下操作:
public boolean isInteger(String str) {
return str.matches("[0-9]+");
}
使用
isInteger
的任何一种实现,当我用stack
集合替换您的堆栈时,我都可以让您的代码运行。希望这有帮助。这帮助我解决了问题,非常感谢!代码计算不正确,但至少运行平稳。再次感谢。很高兴我能提供帮助。是否介意标记我的回答正确吗?