Создание стека Generi c ArrayList с использованием интерфейса - PullRequest
0 голосов
/ 11 марта 2020

Это практический вопрос о дженериках и реализации стека (LIFO), который не должен использоваться в реальной жизни, он предназначен для образовательных целей.

Все методы интерфейсов не могут принимать разные параметры и должны быть реализованы таким образом, чтобы

Интерфейсный стек

import java.util.Iterator;
interface Stack<E>{
    public boolean push(E x);
    public boolean pop();
    public E top();
    public boolean empty();
    public boolean full();
    public Iterator<E> iterator();
}

Понятия не имею, что делать с методом iterator или зачем он мне нужен здесь, поскольку ни один из моих методов используете его?

Я выполнил все остальные методы в приведенном ниже коде

MyStack

import java.util.ArrayList;
import java.util.Iterator;


public class MyStack<E> implements Stack<E>,Iterable<E> {

    //Creating a ArrayList which is bound using a int
    //in the constructor and size keeps track of the 
    //amount of elements in the ArrayLIst
    private int size;
    private ArrayList<E> stack;

    public MyStack(int size) {
        stack = new ArrayList<E>(size);
        size = 0;
    }

    @Override
    public boolean push(E x) {
        //Check to make sure the size of the bounded Arraylist
        //has not been exceeded, if not add element 
        if(size == stack.size()) {
            stack.add(x);
            size++;
            return true;
        }

        return false;

    }

    @Override

    public boolean pop() {
        //If the list is not empty remove the last element 
        if(this.empty()) {
            System.out.println("No elements to remove");
            return false;
        }

        stack.remove(stack.size()-1);
        size--;
        return true;
    }

    @Override
    public E top() {
        //If the stack is not empty return the top element without removing it
        if (empty()) {
            return null;
        }       
        else
            return stack.get(stack.size()-1);       
    }

    @Override
    public boolean empty() {

        return stack.isEmpty();
    }

    @Override
    public boolean full() {

        //If size is equal to the size of the stack
        //it is deemed full
        if(size == stack.size()) {
            System.out.println("The stack is full");
            return true;
        }

        return false;
    }

    @Override
    public Iterator iterator() {
        // TODO Auto-generated method stub
        return null;
    }


    @Override
    public String toString() {
        return "MyStack [size=" + size + ", stack=" + stack + "]";
    }

}

Тестовый код

    stack.push(2);
    stack.push(4);
    stack.push(5);
    stack.push(7);

    System.out.println(stack.toString());

    System.out.println(stack.top());
    stack.pop();
    stack.empty();

    System.out.println(stack.toString());

Кажется, что все методы работают правильно

MyStack [size=4, stack=[2, 4, 5, 7]] 7 MyStack [size=4, stack=[2, 4, 5]]

Единственное другое недоразумение, которое у меня есть, в моей книге - схема добавления к голове где мой Arraylist добавляет к хвосту, но обрабатывает хвост, как если бы это была голова, это нормально?

Это немного сбивает с толку, так как в этой главе они также говорят о LinkedList, как выглядит эта схема. представлять мне, а не ArrayList.

* 1 036 *enter image description here

Метод, используемый в книге

@Override
    public Iterator<E> iterator() {
          ArrayList<E> tmp = new ArrayList<>();

            int ind = stack.size();
            while(ind > 0){
              tmp.add(stack.get(ind-1));
                ind--;
            }
            System.out.println(tmp.toString());
            return tmp.iterator();
    }

1 Ответ

1 голос
/ 11 марта 2020

Как уже упоминалось в комментариях, dan1st используется итератор для обхода / перебора всего стека и предоставления некоторых функций для взаимодействия с элементами стека.

Посмотрите документы Интерфейс итератора .

Как правило, методы, которые предоставляет интерфейс - ваш стек - не обязательно должны использоваться в вашей собственной реализации, но предоставляют пользователю некоторые операции для взаимодействия с вашей реализацией.

Единственное другое недоразумение, которое у меня есть, это то, что в моей книге показана схема добавления к голове, где мой Arraylist добавляет к хвосту, но обрабатывает хвост, как если бы это была голова, это нормально?

Если требуется добавить новые элементы в заголовок go для нее. Это меняет порядок элементов стека. Это хороший совет, как использовать реализацию iterate() в вашей книге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...