使用堆栈评估前缀表达式
Evaluate a prefix expression using stacks
我必须使用堆栈计算前缀表达式,我做到了,但我不明白为什么代码不能正常工作,它在我编译代码时标记了 2 个错误,它们是:
线程 "main" java.lang.ClassCastException 中的异常:java.lang.String 无法转换为 java.lang.Integer
在 evaluationprefix.EvaluationPreFix.EvaluationPrefix(EvaluationPreFix.java:56)
在 evaluationprefix.EvaluationPreFix.main(EvaluationPreFix.java:25)
public class EvaluationPreFix {
public static void main(String[] args) {
Stack st = new Stack();
Scanner sc = new Scanner(System.in);
System.out.println("enter the size of expression");
int t = sc.nextInt();
sc.nextLine();
for (int i = 0; i < t; i++) {
System.out.println("enter an element");
String element = sc.nextLine();
st.push(element);
}
int r = EvaluationPrefix(st); //marks an Error here
System.out.println("Result: " + r);
}
public static int EvaluationPrefix(Stack st) {
Stack st2 = new Stack();
while (!st.isEmpty()) {
Object e = st.pop();
if (e.equals('+')) {
st2.push((Integer) st2.pop() + (Integer) st2.pop());
} else if (e.equals('-')) {
st2.push((Integer) st2.pop() - (Integer) st2.pop());
} else if (e.equals('*')) {
st2.push((Integer) st2.pop() * (Integer) st2.pop());
} else if (e.equals('/')) {
st2.push((Integer) st2.pop() / (Integer) st2.pop());
} else {
st2.push(e);
}
}
return (Integer) st2.pop();//marks an error here
}
}
假设我们正在谈论 java.util.stack - 这只是一个存储您放入其中的内容的集合,并且您将其用作 原始类型.
Stack st = new Stack();
这意味着您可以将任何类型的对象压入此堆栈。似乎您只想存储 Integers
- 通过使用泛型告诉编译器。
Stack<Integer> st = new Stack<>();
这会告诉您问题出在您尝试将 e
转换为 Ìntegerby casting, because in your case, the values of
eare the
Strings you pused into
stin
main ()`.
您还应该将 main
中 st
的声明替换为
Stack<String> st = new Stack<>();
和
的方法声明
public static int EvaluationPrefix(Stack<String> st)
突出问题。
当您有一个 String
并想将其转换为 Integer
时,您需要解析它,例如使用 Integer.parseInt。但您需要注意,如果 String
不是数字,此方法将抛出 NumberFormatException
。您将必须处理此异常,例如通过捕获它并打印有用的错误消息。
所做的更改:
- 在 main 方法中,将堆栈 st 更改为
String
类型。
- 在EvaluationPrefix方法中,
- 将参数堆栈更改为
String
类型。
- 将堆栈 st2 更改为
Integer
类型。
- 将
equals
中的算术运算符更改为 String
。
给你,
public class EvaluationPreFix {
public static void main(String[] args) {
//1. parameterized with String
Stack<String> st = new Stack();
Scanner sc = new Scanner(System.in);
System.out.println("enter the size of expression");
int t = sc.nextInt();
sc.nextLine();
for (int i = 0; i < t; i++) {
System.out.println("enter an element");
String element = sc.nextLine();
st.push(element);
}
int r = EvaluationPrefix(st); //marks an Error here
System.out.println("Result: " + r);
}
//2. parameterized with String
public static int EvaluationPrefix(Stack<String> st) {
//3. parameterized with Integer
Stack<Integer> st2 = new Stack();
while (!st.isEmpty()) {
String e = st.pop();
//4. arithmetic sign comparison to string instead
//of character
if (e.equals("+")) {
st2.push(st2.pop() + st2.pop());
} else if (e.equals("-")) {
st2.push(st2.pop() - st2.pop());
} else if (e.equals("*")) {
st2.push(st2.pop() * st2.pop());
} else if (e.equals("/")) {
st2.push(st2.pop() / st2.pop());
} else {
st2.push(Integer.valueOf(e));
}
}
return st2.pop();
}
}
我必须使用堆栈计算前缀表达式,我做到了,但我不明白为什么代码不能正常工作,它在我编译代码时标记了 2 个错误,它们是:
线程 "main" java.lang.ClassCastException 中的异常:java.lang.String 无法转换为 java.lang.Integer 在 evaluationprefix.EvaluationPreFix.EvaluationPrefix(EvaluationPreFix.java:56) 在 evaluationprefix.EvaluationPreFix.main(EvaluationPreFix.java:25)
public class EvaluationPreFix {
public static void main(String[] args) {
Stack st = new Stack();
Scanner sc = new Scanner(System.in);
System.out.println("enter the size of expression");
int t = sc.nextInt();
sc.nextLine();
for (int i = 0; i < t; i++) {
System.out.println("enter an element");
String element = sc.nextLine();
st.push(element);
}
int r = EvaluationPrefix(st); //marks an Error here
System.out.println("Result: " + r);
}
public static int EvaluationPrefix(Stack st) {
Stack st2 = new Stack();
while (!st.isEmpty()) {
Object e = st.pop();
if (e.equals('+')) {
st2.push((Integer) st2.pop() + (Integer) st2.pop());
} else if (e.equals('-')) {
st2.push((Integer) st2.pop() - (Integer) st2.pop());
} else if (e.equals('*')) {
st2.push((Integer) st2.pop() * (Integer) st2.pop());
} else if (e.equals('/')) {
st2.push((Integer) st2.pop() / (Integer) st2.pop());
} else {
st2.push(e);
}
}
return (Integer) st2.pop();//marks an error here
}
}
假设我们正在谈论 java.util.stack - 这只是一个存储您放入其中的内容的集合,并且您将其用作 原始类型.
Stack st = new Stack();
这意味着您可以将任何类型的对象压入此堆栈。似乎您只想存储 Integers
- 通过使用泛型告诉编译器。
Stack<Integer> st = new Stack<>();
这会告诉您问题出在您尝试将 e
转换为 Ìntegerby casting, because in your case, the values of
eare the
Strings you pused into
stin
main ()`.
您还应该将 main
中 st
的声明替换为
Stack<String> st = new Stack<>();
和
的方法声明public static int EvaluationPrefix(Stack<String> st)
突出问题。
当您有一个 String
并想将其转换为 Integer
时,您需要解析它,例如使用 Integer.parseInt。但您需要注意,如果 String
不是数字,此方法将抛出 NumberFormatException
。您将必须处理此异常,例如通过捕获它并打印有用的错误消息。
所做的更改:
- 在 main 方法中,将堆栈 st 更改为
String
类型。 - 在EvaluationPrefix方法中,
- 将参数堆栈更改为
String
类型。 - 将堆栈 st2 更改为
Integer
类型。 - 将
equals
中的算术运算符更改为String
。
- 将参数堆栈更改为
给你,
public class EvaluationPreFix {
public static void main(String[] args) {
//1. parameterized with String
Stack<String> st = new Stack();
Scanner sc = new Scanner(System.in);
System.out.println("enter the size of expression");
int t = sc.nextInt();
sc.nextLine();
for (int i = 0; i < t; i++) {
System.out.println("enter an element");
String element = sc.nextLine();
st.push(element);
}
int r = EvaluationPrefix(st); //marks an Error here
System.out.println("Result: " + r);
}
//2. parameterized with String
public static int EvaluationPrefix(Stack<String> st) {
//3. parameterized with Integer
Stack<Integer> st2 = new Stack();
while (!st.isEmpty()) {
String e = st.pop();
//4. arithmetic sign comparison to string instead
//of character
if (e.equals("+")) {
st2.push(st2.pop() + st2.pop());
} else if (e.equals("-")) {
st2.push(st2.pop() - st2.pop());
} else if (e.equals("*")) {
st2.push(st2.pop() * st2.pop());
} else if (e.equals("/")) {
st2.push(st2.pop() / st2.pop());
} else {
st2.push(Integer.valueOf(e));
}
}
return st2.pop();
}
}