- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用堆栈解决中缀表达式,但我的程序似乎抛出 ArrayIndexOutOfBoundsException
。
您能指导我如何解决代码中的错误吗?
public class CS6084BTolani {
public static String evaluateInfix(String exps)
{
exps = exps.replaceAll(" ", "");//removing white spaces
System.out.println(exps);
StackADT<Double> values = new StackADT<Double>(exps.length());//Stack for Operands
StackADT<String> ops = new StackADT<String>(exps.length());//for operators
StringTokenizer tokens = new StringTokenizer(exps, "()^*/+-", true);//to seperate all the operands and operators
while(tokens.hasMoreTokens())
{
String tkn = tokens.nextToken();
if(tkn.equals("("))
{
ops.push(tkn);
System.out.println("ADDING to ops : "+ops.peek());
}
else if(tkn.matches("\\d+\\.\\d+")||tkn.matches("\\d+"))
{
values.push(Double.valueOf(tkn));
System.out.println("ADDING to values : "+values.peek());
}
else if (tkn.equals("^") || tkn.equals("*") || tkn.equals("/") || tkn.equals("+") || tkn.equals("-"))
{
while (!ops.isEmpty() && hasPrecedence(tkn, ops.peek()))
values.push(applyOp(ops.pop(), values.pop(), values.pop()));
System.out.println("ADDING to values: "+values.peek());
// Push current token to 'ops'.
ops.push(tkn);
System.out.println("ADDING to ops: "+ops.peek());
}
else if(tkn.equals(")"))
{
while (!(ops.peek()).equals("("))
{
values.push(applyOp(ops.pop(), values.pop(), values.pop()));
System.out.println("ADDING to values: "+values.peek());
}
ops.pop();
}
}
while (!ops.isEmpty())
values.push(applyOp(ops.pop(), values.pop(), values.pop()));
// Top of 'values' contains result, return it
return String.valueOf(values.pop());
}
public static boolean hasPrecedence(String op1, String op2)
{
if (op2 == "(" || op2 == "(")
return false;
if ( (op1 == "^" ) && (op2 == "+" || op2 == "-"))
return false;
if ( (op1 == "^" ) && (op2 == "*" || op2 == "/"))
return false;
if ( (op1 == "*" || op1 == "/") && (op2 == "+" || op2 == "-"))
return false;
else
return true;
}
public static double applyOp(String op, double b, double a)
{
switch (op)
{
case "^":
return Math.pow(a,b);
case "+":
return a + b;
case "-":
return a - b;
case "*":
return a * b;
case "/":
if (b == 0)
throw new
UnsupportedOperationException("Cannot divide by zero");
return a / b;
}
return 0;
}
public static void main(String a[]) throws Exception
{
//Input ip = new Input("inputData4B.txt");
String expOne = "(100.0 + 2.3)";//ip.getFirstString();
System.out.println("Answer: "+evaluateInfix(expOne));
//String expTwo = ip.getSecondString();
//System.out.println("Answer: "+evaluateInfix(expTwo));
//String expThree = ip.getThirdString();
//System.out.println("Answer: "+evaluateInfix(expThree));
//String expFour = ip.getFourthString();
//System.out.println("Answer: "+evaluateInfix(expFour));
}
}
class StackADT<T extends Object> {
private int stackSize;
private T[] stackArr;
private int top;
public StackADT(int size)
{
stackSize = size;
stackArr = (T[]) new Object[stackSize];
top = -1;
}
public void push(T element){
stackArr[++top] = element;
}
public T pop()
{
if(isEmpty())
{
System.out.println("Stack is isEmpty.");
}
T element = stackArr[top--];
return element;
}
public T peek()
{
return stackArr[top];
}
public boolean isEmpty()
{
return (top == -1);
}
}
运行时是这样的:
java CS6084BTolani
(100.0+2.3)
ADDING to ops : (
ADDING to values : 100.0
Stack is isEmpty.
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at StackADT.pop(CS6084BTolani.java:139)
at CS6084BTolani.evaluateInfix(CS6084BTolani.java:38)
at CS6084BTolani.main(CS6084BTolani.java:102)
最佳答案
这似乎是一个逻辑错误(概念错误?)。
尝试使用标记顺序评估表达式。当下一个操作 token
可用时,将应用操作
,但在弹出值之前不会检查值堆栈
大小是否大于或等于执行(解释)操作所需的值的数量。这就是为什么最后打印的消息是 Stack isEmpty.
。
算法——中缀表达式求值算法。
如果目标是学习如何设计算法,那么尝试自己设计。否则,请使用其描述来学习算法,例如,来自 this source .
在更新当前实现之前,请尝试了解它有什么问题:将其与设计或描述的版本进行比较。之后,更新实现或创建一个新的实现(如果需要进行大量更改)。
目前,我发现操作优先级处理存在问题。请考虑以下操作处理:
else if (tkn.equals("^") || tkn.equals("*") || tkn.equals("/") || tkn.equals("+") || tkn.equals("-")) {
if (!ops.isEmpty() && !hasPrecedence(tkn, ops.peek())) {
values.push(applyOp(ops.pop(), values.pop(), values.pop()));
System.out.println("ADDING to values: " + values.peek());
}
else {
// Push current token to 'ops'.
ops.push(tkn);
System.out.println("ADDING to ops: " + ops.peek());
}
}
关于java - 如何避免 ArrayIndexOutOfbounds 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39810418/
实体类是: DeviceWithReading.java package com.fde.entity; import java.util.Set; import javax.persistence.
这个问题在这里已经有了答案: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? (26 个
我有一个小问题,当我尝试从文件读取时,我会遇到 arrayindexoutofboundsException 。我不知道有更好或更详细的解释方法,所以我将粘贴下面的代码和错误。这一切都在我的程序的 m
我写了这个方法: public static Bitmap matrixToBitmap(int[][] slika) { int w = slika[0].length;
我的代码需要一些帮助,当我尝试运行它时,它给了我 arrayindexoutofbounds 0 异常,它指向“results[counter]=random;”行,以及我在它之前写的 system.
我需要以蛇的形式打印矩阵。因此对于这个矩阵,输出应该是: 我的问题是这段代码抛出 ArrayIndexOutofBounds。我该如何处理才能避免这种情况? int[][] mat= {{1,2,3}
我正在制作阿拉伯数字转换器并收到错误: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at ar
我不明白为什么会发生这种情况。如果没有 print 语句,代码可以正常工作,但是当我尝试打印元素时,我得到 ArrayIndexoutOfBounds。例如,如果我尝试提供 3 个元素,则会抛出异常。
我正在尝试将 Google 任务与我的应用程序同步。为此,我创建了一个类,在其中创建了需要获取任务列表和创建列表等的所有方法。 现在我想测试一下这些方法是否有效。为此,我创建了一个扩展 AsyncTa
这个问题已经有答案了: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? (25 个回答)
所以我目前正在研究多维数组(2D),并且尝试反转二维数组中每个数组的顺序。 所以我有一个二维数组设置为:int firstArray[][] = {{5,6,7,8,9,10}, {11,12,13,
问题出在int [][]tam = new int [a][b]处。就只有那一条线。我是 Java 新手,有 C++ 背景。 //"Exercitiul" 3 Scanner input = new
这是我遇到索引越界异常的代码,我不明白为什么, int index = array.length - 1; E item = array[index]; while (item == null
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
public class Environment { //variables RoundingStage[][] land; int horizontalStreets;
我正在尝试创建一种使用动态编程计算(N 选择 R)的方法,但出现数组越界异常: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsEx
public Pasient[] finnPasient(String dato) { int j = 0; Pasient[] p = new Pasient[j]; for
所以我有一个数组 Canvas[256][256],它的随机索引 Canvas[r][r] (r 是随机的)设置为 1。然后我想循环遍历该数组以准确查看哪个索引是不是 0,然后随机选择一个点(上、下、
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我写了一个 TokenizableString 类,它对用户输入的字符串进行标记化。这是它应该如何进行的示例 我输入 "My name is methos" 我应该在控制台中看到以下内容 'My' '
我是一名优秀的程序员,十分优秀!