#java #list #stack #push #postfix-mta
Вопрос:
У нас есть список и ADTStackJqwikTest. Вот мой код в ListStack для метода push и PushAll ().
@Override
public Stack<A> push(A e) {
return new ListStack(list.cons(e));
}
@Override
public Stack<A> pushAll(List<A> xs) {
return xs.isEmpty() ? this : new ListStack<A>(List.append(xs, list));
}
В моем списке у меня есть тест:
public static void main(String[] args) {
Stack<Integer> s1 = empty();
s1 = s1.pushAll(list(1,2,3));
s1 = s1.pushAll(list(1,2,3));
System.out.println("PushAll: " s1.toList());
Stack<Integer> s2 = empty();
s2 = s2.push(1);
s2 = s2.push(2);
s2 = s2.push(3);
s2 = s2.push(1);
s2 = s2.push(2);
s2 = s2.push(3);
System.out.println("Push: " s2.toList());
}
}
результат, который я получаю, таков:
Пушалл: 1, 2, 3, 1, 2, 3
Толчок: 3, 2, 1, 3, 2, 1
Но результат должен быть тот же самый. Что я делаю не так?
В моем тесте adtstackjqwik я должен использовать методы PushAll ().
// ∀s:Stack<A> : pushAll([],s) = s
@Property
<A> boolean pushAll(@ForAll("stacks") Stack<A> s) {
return s.pushAll(List.list()).equals(s);
}
// ∀s:Stack<A>, ∀xs:List<A> : pushAll(x:xs,s)= push(x,pushAll(xs,s)), falls s nicht leer
@Property
<A> boolean pushAll(@ForAll("stacks") Stack<A> s, @ForAll("lists") List<A> xs, @ForAll("as") A x) {
return s.pushAll(xs.cons(x)).equals(s.push(x).pushAll(xs));
}
Комментарии:
1. Откуда берутся строчные
list
буквы?2. Из класса: общедоступный класс ListStack<A> реализует стек<A><A> { закрытый конечный список<A><A> список; закрытый список(Список<A><A> список) { это. список = список; } частный список() { это. список = список(); }
3. Давайте посмотрим код для «list.cons(e)».
4. публичный список<A> минусов(A a) { возвращает новые минусы<A><>(a, это); }
5. Примечание: минусы(«a», список(«b»,»c»)) = (a b c) , поэтому нажмите 1,2,3 => 3,2,1 в списке?
Ответ №1:
package stack;
список импорта.Список;
импорт кортежа.Кортеж;
импорт статического списка.Список.список;
общедоступный класс ListStack реализует стек {
private final List<A> list;
private ListStack(List<A> list) {
this.list = list;
}
private ListStack() {
this.list = list();
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
@Override
public Stack<A> push(A e) {
return new ListStack<A>(list.cons(e));
}
@Override
public Stack<A> pop() {
if(isEmpty())
throw new IllegalStateException("pop from an empty stack");
else return new ListStack<A>(list.tail());
}
@Override
public A top() {
if(isEmpty())
throw new IllegalStateException("top from an empty stack");
else return list.head();
}
@Override
public Tuple<A, Stack<A>> popTop() {
return Tuple.tuple(top(), pop());
}
@Override
public Tuple<List<A>, Stack<A>> popTopAll() {
return null;
}
@Override
public Stack<A> pushAll(List<A> xs) {
return xs.isEmpty() ? this : new ListStack<A>(List.append(xs, list));
}
@Override
public List<A> toList() {
return list;
}
@Override
public boolean isEqualTo(Stack<A> s) {
return this.toList().isEqualTo(s.toList());
}
@Override
public boolean equals(Object o) {
return o instanceof Stack amp;amp; isEqualTo((Stack) o);
}
public String toString() {
return list.toString();
}
public static <A> Stack<A> empty() {
return new ListStack(list());
}
Это весь мой список
Комментарии:
1. можете ли вы также поделиться реализацией List.cons?
Ответ №2:
менять
@Override
public Stack<A> pushAll(List<A> xs) {
return xs.isEmpty() ? this : new ListStack<A>(List.append(xs, list));
}
в
@Override
public Stack<A> pushAll(List<A> xs) {
return xs.isEmpty() ? this : new ListStack<A>(List.append(list, xs));
}
Комментарии:
1. Тот же результат. Это ничего не меняет в результате.
Ответ №3:
Ладно, я понял. Спасибо вам, ребята. Ошибка заключалась в добавлении в методе PushAll.