java - 字符串索引异常
问题描述
我试图将表达式从中缀形式转换为后缀形式。我分别使用 String a、p、s 用于堆栈、后缀结果表达式、输入表达式。每次我收到此错误时:
线程“主”java.lang.StringIndexOutOfBoundsException 中的异常:字符串索引超出范围:javaapplication4 的 java.lang.String.charAt(String.java:658) 的 -1.A.conversion(A.java:50) 的 javaapplication4 .A.main(A.java:83)
请帮助我如何解决它。
这是我的代码:
import java.util.Scanner;
public class A {
String a="(", s = "", p = "";
int i, n = 1, top = 0, pp = 0;
void push(char ch) {
a = a + ch;
top = n;
n++;
}
void pop() {
n--;
top--;
}
int prio(char ch) {
int f = -1;
if (ch == '(') {
f = 0;
} else if (ch == '+' || ch == '-') {
f = 1;
} else if (ch == '*' || ch == '/' || ch == '%') {
f = 2;
} else if (ch == '^') {
f = 3;
}
return f;
}
void conversion() {
System.out.print("Enter infix form: ");
Scanner sd = new Scanner(System.in);
s = sd.nextLine();
//System.out.println(s);
int t, j, sz;
sz = s.length();
for (i = 0; i < sz; i++) {
if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
p = p + s.charAt(i);
pp++;
} else if (s.charAt(i) == '(') {
push('(');
} else if (s.charAt(i) == '-' || s.charAt(i) == '+' || s.charAt(i) == '*' || s.charAt(i) == '/' || s.charAt(i) == '%' || s.charAt(i) == '^') {
j = prio(s.charAt(i));
t = prio(a.charAt(top));
//System.out.println(t+" "+j);
while (j <= t) {
p = p + a.charAt(top);
pp++;
pop();
t = prio(a.charAt(top));
}
push(s.charAt(i));
} else if (s.charAt(i) == ')') {
while (a.charAt(top) != '(') {
p = p + a.charAt(top);
pp++;
pop();
}
pop();
}
}
while (a.charAt(top) != '(') {
p = p + a.charAt(top);
pp++;
pop();
}
pop();
}
void postfix() {
System.out.print("postfix form is: ");
System.out.println(p);
}
public static void main(String args[]) {
A h = new A();
h.conversion();
h.postfix();
//System.out.println(h.a);
//System.out.println(h.s);
}
}
解决方案
你可能做了一个额外的 pop() 定义。你能检查一下吗?
推荐阅读
- matlab - 在 MATLAB 中按数据 ID 对 .csv 中的行进行分组
- c++ - 如何将所有内核用于 C++ 程序
- r - 当代码在函数内部时,RStudio 中的 Rmarkdown 块预览不起作用
- laravel - 多次编译同一个scss文件——laravel mix
- amazon-web-services - 容器的 ECS 健康检查通过,但容器无响应
- java - 通过使用 maven 构建指定模块的依赖树来构建 classpath.properties
- amazon-web-services - AWS RedShift:并发扩展在峰值期间不添加集群
- laravel - 如何在延迟作业到达 available_at 之前处理它们?
- c++ - 如何使用 C/C++ 通过 gRPC 发送字节数据?
- r - 如何在二项式 GLMM(lme4)中确定正确的混合效应结构?