Это практический вопрос о дженериках и реализации стека (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 *
Метод, используемый в книге
@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();
}