使用堆栈评估前缀表达式

时间:2017-09-16 05:26:28

标签: java math data-structures stack discrete-mathematics

我必须使用堆栈来评估前缀表达式,我做了但我不明白为什么代码不能正常工作,它在编译代码时标记了2个错误,它们是:

线程“main”中的异常java.lang.ClassCastException:java.lang.String无法强制转换为java.lang.Integer     at evaluationprefix.EvaluationPreFix.EvaluationPrefix(EvaluationPreFix.java:56)     at 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
}

}

2 个答案:

答案 0 :(得分:1)

所做的更改:

  • 方法中,将堆栈 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();
    }

}

答案 1 :(得分:0)

假设我们正在讨论java.util.stack - 这只是一个存储你所推送内容的集合,并且你将它用作原始类型

Stack st = new Stack();

这意味着您可以将任何类型的对象推送到此堆栈上。看起来你只想存储Integers - 通过使用泛型告诉编译器。

Stack<Integer> st = new Stack<>();

这将告诉您问题出在您尝试将e转换为by casting, because in your case, the values of e are the字符s you pused into st in main()的任何地方`。

您还应该将stmain的声明替换为

Stack<String> st = new Stack<>();

和方法声明

public static int EvaluationPrefix(Stack<String> st)

突出问题。

如果您有String并希望将其转换为Integer,则需要对其进行解析,例如使用Integer.parseInt。但是您需要注意,如果NumberFormatException不是数字,此方法将抛出String。您将不得不处理此异常,例如通过捕获它并打印有用的错误消息。