2017-04-06 11 views
-1

스택 복사 생성자에 많은 어려움이 있습니다. DSStack은 Stack 추상 클래스를 확장하고 이중 연결 목록을 사용하여 데이터 (토큰)를 저장합니다. 생성자의 행 this.push(oldListNode.getToken());에서 실패 (NullPointerException)가 계속 유지됩니다. 내 문제를 해결하는 데 도움이 될 것으로 생각되는 방법/수업을 포함했습니다. 사본이어야합니다. 어떤 도움이나 지침도 굉장합니다.스택 복사 생성자

public class DSStack extends Stack { 

    // The list containing the data 
    private DSList theStack; 

    // Constuct an empty stack using a LinkedList as the container 
    public DSStack() { 
     theStack = new DSList(); 
    } 

    public DSStack(DSStack other) { 
    // Create a reference for the stack to be copied 
    Node oldListNode = other.theStack.head; 

    while (oldListNode != null) { 
     this.push(oldListNode.getToken()); 
     oldListNode = oldListNode.next; 
     } 
    } 

    /** 
    * Adds the given object to the top of the Stack. 
    * @return The given object. 
    */ 
    public Token push(Token obj) {  
     theStack.add(obj); 
     return obj; 
    } 
} 

public class DSList implements List { 

    /** 
    * Appends the specified element to the end of this list. 
    * @param obj The object to add. 
    * @return True if the object has been added to the list. 
    * 
    * @throws NullPointerException if the specified object is null. 
    */ 
    public boolean add(Token obj) { 
     if (obj == null) { 
      throw new NullPointerException(); 
     } 
     // If list is empty, add new node to front. 
     if(isEmpty()) { 
      // Create a new Node. Add Token obj as data 
      Node newNode = new Node(null, null, obj); 
      // point head to new Node, newNode 
      head = newNode; 
      return true; 
     } else { 
      // create a reference of the start position in the list 
      Node current = head; 
      // While there are nodes remaining in the list, advance through to reach the end. 
      while (current.next != null) 
       current = current.next; 
      // Create a new node and append it to the end of the list, with 'prev' pointing to current (2nd to last node) 
      Node newNode = new Node(null, current, obj); 
      // Point 2nd to last element to the newest , last node in the list (in next variable) 
      current.next = newNode; 
      // Return true if successful addition of node. 
      return true; 
     } 
    } 
} 

public class Node { 

    public Node next; 
    public Node prev; 

    // data being stored in each node 
    private Token t; 

    // Node constructor 
    public Node(Node next, Node prev, Token token) { 
     this.next = next; 
     this.prev = prev; 
     this.t = token; 
    } 

    public Token getToken() { 
     return t; 
    } 
} 

public class Token { 

    public enum Type { OPERATOR, OPERAND, PAREN }; 
    public Type type; 

    private String operator; 
    private double operand; 

    public Token(double result) { 
     this.operand = result; 
     this.type = Type.OPERAND; 
    } 

    public Token(String op) { 
     this.operator = op; 
     this.type = Type.OPERATOR; 

     if (this.operator.equals("(") || this.operator.equals(")")) { 
      this.type = Type.PAREN; 
     } 
    } 

    public Token(Token other) { 
     this.operator = other.operator; 
     this.operand = other.operand; 
     this.type = other.type; 
    } 
} 
+0

을 초기화 인수 없음 생성자, 그것은 당신이 우리를 말하는 것보다 스택 추적에 더 있었다 의미없는 가 (예외가오고 호출 복사 생성자에서 직접 생성 한 것이 아니라 'push'에서 생성 한 것입니다.) 그런 정보를 포함하면 어떤 일이 벌어지고 있는지 쉽게 볼 수 있습니다. –

답변

0

작문 작성자는 때때로 예술 작품 일 수 있습니다. 모든 당신은

public DSStack() 
{ 
    theStack = new DSList(); 
} 

public DSStack(DSStack other) 
{ 
    this(); 
    // Rest of the code goes on 
    // Create a reference for the stack to be copied 
    Node oldListNode = other.theStack.head; 

    while (oldListNode != null) 
    { 
     this.push(oldListNode.getToken()); 
     oldListNode = oldListNode.next; 
    } 

} 

이 항상 상관없이 초기화 DSStack 개체에 대한 메모리를 할당 할 수있는 생성자 theStack 변수를 초기화하지 있는지 확인합니다을해야한다. 이() 문은 실제로 당신이 theStack 대답은 올바른 가정 변수

+0

고마워, 내 문제가 해결되었습니다. – BobSacamano

1

당신은 당신의 paramterized 생성자 public DSStack(DSStack other) 내부 theStack를 초기화해야합니다. 난 그 일이 보지 못했고, 따라서 당신의 매개 변수화 된 생성자를 사용하여 생성 된 어떤 객체에 대해서도 여전히 null 값을 포함하고 있습니다. push 방법의 theStack 참조에 대해 이야기하고 있음을 주목하십시오.