Для моего задания мы должны создать эмуляцию связанного списка LISP на Java. Существует два типа List, EmptyList и NonEmptyList. EmptyList является в основном тривиальным и служит только для завершения связанного списка. Способ, которым он должен работать, состоит в том, что каждый Список имеет голову и хвост. Голова - это Объект, а Хвост - следующий Связанный Список. У меня есть Linked интерфейс List следующим образом:Lisp Связанный список Emulation Java
public interface LispList {
EmptyList NIL = new EmptyList();
boolean empty();
Object head();
LispList tail();
LispList cons(Object inputHead);
}
А вот NonEmptyList класс:
public class NonEmptyList implements LispList{
Object head;
LispList tail;
public NonEmptyList(Object inputHead) {
this.head = inputHead;
this.tail = new NonEmptyList(head);
}
public boolean empty() {
return false;
}
public Object head() {
return head;
}
public LispList tail() {
return tail;
}
public String toString() {
return head() + " " + tail().toString();
}
public NonEmptyList cons(Object inputHead) {
NonEmptyList a = new NonEmptyList(inputHead);
return a;
}
public class NIL{
EmptyList NIL;
}
}
EmptyList:
public class EmptyList implements LispList {
public EmptyList() {
}
public boolean empty() {
return true;
}
public Object head() {
throw new UnsupportedOperationException("EmptyList");
}
public LispList tail() {
throw new UnsupportedOperationException("EmptyList");
}
public String toString() {
return "";
}
public class NIL{
EmptyList NIL;
}
public NonEmptyList cons(Object inputHead) {
NonEmptyList a = new NonEmptyList(inputHead);
return a;
}
}
А вот мой тестер:
public class LispListTest {
public static void main(String[] args) {
LispList list = LispList.NIL.cons("C").cons("B").cons("A");
System.out.println(list.tail());
System.out.println(list.toString());
}
}
Проблема у меня есть i s в конструкторе NonEmptyList. То, как я это делаю, в настоящее время дает мне исключение переполнения стека. Я пробовал несколько разных вещей, и никто из них не работает так, как мне нужно. Я не уверен, как сделать конструктор таким образом, чтобы хвост указывал на следующий список.
Это моя первая попытка связанного списка, поэтому я могу сделать довольно простую ошибку.
Ваш 'NonEmptyList' конструктор вызывает себя снова и снова ... – aribeiro
Возможно, соответствующие [LISP связанный список с Java] (https: // common-lisp.net/project/armedbear/). –
Конструктор 'NonEmptyList' должен принимать два аргумента - голову и хвост. – SpiderPig