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