为什么这个程序没有正常运行?

时间:2015-12-08 20:28:54

标签: java stack

该任务是使用Stacks创建一个后缀到中缀转换器。该程序编译正确,但当我尝试制作一个演示类时,我收到了零点异常行32.请分享任何观察,更好的编码约定或解决方案。

import java.util.Stack;

public class PostfixtoInfix {
    private String expression;
    private Stack<Character> s;
    Character pOpen = new Character('(');
    Character pClose = new Character(')');

    public String PostfixtoInfix(String e) {
        expression = e;
        String output = "";
        for (int i = 0; i < e.length(); i++) {
            char currentChar = e.charAt(i);
            if (isOperator(currentChar)) {
                while (!s.empty() && s.peek() != pOpen
                        && hasHigherPrecedence(s.peek(), currentChar)) {
                    output += s.peek();
                    s.pop();
                }
                s.push(currentChar);
            } else if (isOperand(currentChar)) {
                output += currentChar;
            } else if (currentChar == '(') {
                s.push(currentChar);
            } else if (currentChar == ')') {
                while (!s.empty() && s.peek() != pClose) {
                    output += s.peek();
                    s.pop();
                }
            }
            while (!s.empty()) {
                output += s.peek();
                s.pop();
            }
        }
        return output;
    }

    public boolean isOperator(char c) {
        if (c == '+' || c == '-' || c == '/' || c == '*' || c == '^')
            return true;
        return false;
    }

    public boolean isOperand(char c) {
        if (c >= '0' && c <= '9')
            return true;
        if (c >= 'a' && c <= 'z')
            return true;
        if (c >= 'A' && c <= 'Z')
            return true;
        return false;
    }

    public int getOperatorWeight(char operator) {
        int weight = -1;
        switch (operator) {
        case '+':
        case '-':
            weight = 1;
            break;

        case '*':
        case '/':
            weight = 2;
            break;

        case '^':
            weight = 3;
        }
        return weight;
    }

    public boolean hasHigherPrecedence(char operator1, char operator2) {
        int op1 = getOperatorWeight(operator1);
        int op2 = getOperatorWeight(operator2);
        if (op1 == op2) {
            if (isRightAssociative(operator1))
                return false;
            else
                return true;
        }
        return op1 > op2 ? true : false;
    }

    public boolean isRightAssociative(char op) {
        if (op == '^')
            return true;
        return false;
    }
}

4 个答案:

答案 0 :(得分:2)

修复NPE 初始化对象。与C ++不同,Stack<Character> s;相当于Stack<Character> s = null;; Stack<Character> s = new Stack<>();

谨防==!= 的行为与您对盒装对象的期望一样。

Character a = new Character('A');
Character aa = new Character('A');
System.out.println(a == aa);

给出(正确的!)答案false

他们是不同的对象。如果要比较相等性,请使用:

System.out.println(a.equals(aa));
System.out.println((char)a==(char)aa);

第一种方法使用显式方法比较对象内容。第二个通过使用非对象原语来避免这个问题,其中相等是按位,而不是引用相等。

答案 1 :(得分:0)

您似乎声明了私人成员s,从不为其分配任何内容,然后尝试在s.empty()s.pop()等表达式中使用它。如果没有为s分配任何内容,则它为null,并且尝试在其上调用方法将导致NullPointerException。

要创建空堆栈,您可能希望将声明更改为:

private Stack <Character> s = new Stack<Character>();

答案 2 :(得分:0)

首先,你有一个看起来像构造函数的方法:

public String PostfixtoInfix(String e) {

尝试将其更改为其他内容,例如:

public String transform(String e) {

其次,永远不会为您的s字段分配堆栈。放

s = new Stack<Character>();

在你的构造函数中。此外,new Character('a') != new Character('a'),因为这将绕过自动(枕​​头缓存)拳击。请使用简单的char作为pOpen和pClose。

答案 3 :(得分:-2)

您的访问修饰符可能阻止程序访问堆栈。 变化:

private Stack <Character> s; 

到:

protected Stack <Character> s;

了解更多here