Java ListStack метод push и PushAll()

#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.