使用堆栈的NullPointerException中缀到postfix java

时间:2013-09-19 01:09:43

标签: java nullpointerexception stack postfix-notation infix-notation

目前我正在使用ArrayStack创建一个项目来将中缀更改为postfix并评估后缀评估。对于程序读取时出现的第一个运算符,它会发回

java.lang.NullPointerException
at InfixToPostfix.convertString(InfixToPostfix.java:27)
at Postfix.main(Postfix.java:20)

我调试了程序,我知道它必须在ArrayStack中处理我的推送方法。我只是不知道如何摆脱NullPointerException

这是我的ArrayStack课程。

import java.util.*;

public class ArrayStack<T> implements StackADT<T>{

private int top = 0;
private static final int DEFAULT_CAPACITY = 70;
private T[] stack;

@SuppressWarnings("unchecked")
public ArrayStack() 
{
    top = 0;
    stack = (T[])(new Object[DEFAULT_CAPACITY]);
}

@SuppressWarnings("unchecked")
public ArrayStack (int initialCapacity)
{
    top = 0;
    stack = (T[])(new Object[initialCapacity]);
}

public boolean isEmpty()
{
    if(top==0)
        return true;
    else
        return false;
}

public T pop() throws StackIsEmptyException
{
    T retVal;
    if(isEmpty())
        throw new StackIsEmptyException("Stack is Empty");
    else{
                    top--;
        retVal = stack[top];
        }
    return retVal;
}

**public void push (T element)
{
    if (size() == stack.length)
        expandCapacity();
    top++;
            element = stack[top];
}**

public T peek() throws StackIsEmptyException
{
    if (isEmpty())
        throw new StackIsEmptyException("Stack is Empty");
    return stack[top-1];
}

@SuppressWarnings("unchecked")
private void expandCapacity()
{
    T[] larger = (T[])(new Object[stack.length*2]);
    for (int index=0; index < stack.length; index++)
        larger[index] = stack[index];
    stack = larger;
}

@Override
public String toString() {
      String result = "";
      for (int scan=0; scan < top; scan++) 
         result = result + stack[scan].toString() + "\n";
      return result;    
}
@Override
public int size() {
    return top;
}
 }

InfixToPostfix classe

 public class InfixToPostfix {
private ArrayStack<Character> stack;
private String infix;
private String postfix= "";

public InfixToPostfix(String in, ArrayStack<Character> stack) {
    infix = in;
    this.stack = stack;
}

@SuppressWarnings("unused")
public String convertString (){
    for (int i = 0; i< infix.length(); i++){
        try {
                char curChar = infix.charAt(i);
                if(!isOperator(curChar)){
                    postfix = postfix + curChar;
                    if (i == (infix.length()-1)){
                        while(!stack.isEmpty()){
                            postfix += stack.pop();                         
                        }
                    }
                }**else if(stack.isEmpty()&& isOperator(curChar)){
                    stack.push(curChar);**
                }
                else if(charPrec(curChar) == 4){
                    while (!stack.isEmpty() && stack.size() != '('){
                        postfix += stack.pop();
                    }
                    stack.pop();
                }else if(!(stack.isEmpty())&&(precident(curChar,stack.peek()))){
                    stack.push(curChar);
                    if(charPrec(stack.peek())==3)
                        stack.push(curChar);
                    while (!(stack.isEmpty())&&(!precident(curChar,stack.peek()))){
                        postfix += stack.pop();
                    }
                    stack.push(curChar);
                }       
            }
            catch (StackIsEmptyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return postfix;
    }

/**
* Evaluates the specified postfix expression. If an operand is
* encountered, it is pushed onto the stack. If an operator is
* encountered, two operands are popped, the operation is
* evaluated, and the result is pushed onto the stack.
* @param expr String representation of a postfix expression
* @return int value of the given expression
*/
public int evaluate (String expr)
{
    int op1, op2, result = 0;
    String token;
    StringTokenizer tokenizer = new StringTokenizer (expr);
    /* while (tokenizer.hasMoreTokens())
    {
        token = tokenizer.nextToken();
        if (isOperator(token))
        {
            op2 = (stack.pop()).charValue();
            op1 = (stack.pop()).charValue();
            result = evalSingleOp (token.charAt(0), op1, op2);
            stack.push (new Integer(result));
        }
        else
            stack.push (new Integer(Integer.parseInt(token)));
    } */
return result;
}
/**
* Determines if the specified token is an operator.
* @param token String representing a single token
* @return boolean true if token is operator
*/
private boolean isOperator (String token)
{
return ( token.equals("+") || token.equals("-") ||
token.equals("*") || token.equals("/") );
}
/**
* Performs integer evaluation on a single expression consisting of
* the specified operator and operands.
* @param operation operation to be performed
* @param op1 the first operand
* @param op2 the second operand
* @return int value of the expression
*/
private int evalSingleOp (char operation, int op1, int op2)
{
    int result = 0;
    switch (operation)
{
    case '+':
        result = op1 + op2;
        break;
    case '-':
        result = op1 - op2;
        break;
    case '*':
        result = op1 * op2;
        break;
    case '/':
        result = op1 / op2;
}
    return result;
}


private boolean isOperator(char ch) { 
    if(ch=='/'||ch=='*'||ch=='+'||ch=='-') 
        return true; 
    else 
        return false; 
    }


private boolean precident(char one, char two) {
    if(charPrec(one) >= charPrec(two));
        return true;
}
private int charPrec(char ch) { 
    switch(ch) { 
        case '-':
            return 1; 
        case '+':
            return 1; 
        case '*':
            return 2; 
        case '/':
            return 2;
        case '(':
            return 3;
        case ')':
            return 4;
    } 
    return 0; }
  }

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题......继承了我看到的问题:

  1. 什么时候size()方法返回char值? size()是一个非常糟糕的方法名称。
  2. 整个ArrayStack<T> implements StackADT<T>类应该是CharacterStack implments StackADT<Character>,这可以简化很多事情
  3. 我认为这一行在第27行(你的空指针所在的位置)有:stack.size() != '(',但这几乎没有意义.....尽管它不会抛出空指针。< / LI>
  4. 你没有说明哪一行有问题 - 在实际代码中标记它以便我们可以看到它,而不必自己统计这些行。
  5. 代码方法和变量名称使得阅读非常困难。修复命名约定,编辑和重试。

    我的猜测是,如果您对代码进行了修改,您将自己找到问题。