调车场算法在Java中的实现,输出错误,字符串索引超出范围?

调车场算法在Java中的实现,输出错误,字符串索引超出范围?,java,indexing,output,shunting-yard,Java,Indexing,Output,Shunting Yard,我正在实现调车场算法并评估结果这是一个基于参考的实现,使用节点(一个用于运算符,一个用于操作数)和堆栈(一个用于运算符,一个用于操作数) 输入文件包含(仅前几行): 输出: 53 = 53 53513 = 1 535152 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 7 at java.lang.String.charAt(String

我正在实现调车场算法并评估结果这是一个基于参考的实现,使用节点(一个用于运算符,一个用于操作数)和堆栈(一个用于运算符,一个用于操作数)


输入文件包含(仅前几行):

输出:

53 = 53
53513 = 1
535152
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 7
    at java.lang.String.charAt(String.java:646)
    at LabIII.main(LabIII.java:48)

Process completed.
主要内容:

节点(也有一个用于操作数/整数):

算法如下:

初始化运算符堆栈以包含“;”(堆栈底部操作符)

获取第一个令牌

而未到达表达式的结尾

如果标记是操作数,则

打印令牌

将操作数推送到操作数堆栈上

否则,如果令牌是“'),则

而运算符堆栈的顶部不等于“(”

弹出操作符堆栈

打印操作员

弹出操作数堆栈两次

将指定的运算应用于两个操作数

将运算结果推送到操作数堆栈上

结束时

弹出“(”并丢弃它

否则

当输入优先级(令牌)时≤ stackPriority(操作员堆栈顶部)

弹出操作符堆栈

打印操作员

弹出操作数堆栈两次

将指定的运算应用于两个操作数

将运算结果推送到操作数堆栈上

结束时

将令牌推送到操作符堆栈上

获取下一个令牌

结束时

而运算符堆栈的顶部不等于“;”

弹出操作符堆栈

打印操作员

弹出操作数堆栈两次

将指定的运算应用于两个操作数

将运算结果推送到操作数堆栈上

结束时

弹出操作数堆栈并打印结果

感谢您的帮助

token = expr.charAt(count);
这应该是

token = expr.charAt(index);
我不知道你为什么要费心维护
索引和
计数。
这只会导致这样的麻烦

这应该是

token = expr.charAt(index);
我不知道你为什么要费心维护
索引和
计数。
这只会导致这样的麻烦

这应该是

token = expr.charAt(index);
我不知道你为什么要费心维护
索引和
计数。
这只会导致这样的麻烦

这应该是

token = expr.charAt(index);

我不知道你为什么要费心维护
索引和
计数。
这只会导致这样的麻烦。

我解决了问题。还有两个问题:

首先,输入文件末尾有两个额外的空行,这导致了异常

其次,
tokenI=expr.charAt(index)
将ASCII值分配给tokenI(例如,5的输入值导致tokenI为53),因此我只需减去48(0的ASCII值)来纠正这个问题。
tokenI=expr.charAt(index)-48
之后所有的事情都安排妥当了


另外,正如@EJP所说,不需要“index”和“count”变量,所以我删除了“count”而只使用了“index”。

我解决了问题。还有两个问题:

首先,输入文件末尾有两个额外的空行,这导致了异常

其次,
tokenI=expr.charAt(index)
将ASCII值分配给tokenI(例如,5的输入值导致tokenI为53),因此我只需减去48(0的ASCII值)来纠正这个问题。
tokenI=expr.charAt(index)-48
之后所有的事情都安排妥当了


另外,正如@EJP所说,不需要“index”和“count”变量,所以我删除了“count”而只使用了“index”。

我解决了问题。还有两个问题:

首先,输入文件末尾有两个额外的空行,这导致了异常

其次,
tokenI=expr.charAt(index)
将ASCII值分配给tokenI(例如,5的输入值导致tokenI为53),因此我只需减去48(0的ASCII值)来纠正这个问题。
tokenI=expr.charAt(index)-48
之后所有的事情都安排妥当了


另外,正如@EJP所说,不需要“index”和“count”变量,所以我删除了“count”而只使用了“index”。

我解决了问题。还有两个问题:

首先,输入文件末尾有两个额外的空行,这导致了异常

其次,
tokenI=expr.charAt(index)
将ASCII值分配给tokenI(例如,5的输入值导致tokenI为53),因此我只需减去48(0的ASCII值)来纠正这个问题。
tokenI=expr.charAt(index)-48
之后所有的事情都安排妥当了

另外,正如@EJP所说,不需要“index”和“count”变量,所以我删除了“count”而只使用了“index”

token = expr.charAt(index);