FOP-2425-Marathon/H09/src/main/java/h09/StackOfObjects.java
2025-04-04 15:13:13 +02:00

90 lines
2.3 KiB
Java

package h09;
import org.tudalgo.algoutils.student.annotation.DoNotTouch;
import org.tudalgo.algoutils.student.annotation.StudentImplementationRequired;
/**
* An object of class {@link StackOfObjects} represents a data structure of type stack.
*/
@SuppressWarnings({"ManualArrayCopy", "unchecked"})
public class StackOfObjects<O> {
@StudentImplementationRequired("H9.1.1") // TODO: H9.1.1
private O[] objs = (O[]) new Object[0];
/**
* Pushes the given object on this stack.
*
* @param obj the object
*/
@StudentImplementationRequired("H9.1.2") // TODO: H9.1.2
public void push(O obj) {
O[] newArray = (O[]) new Object[objs.length + 1];
for (int i = 0; i < objs.length; i++) newArray[i] = objs[i];
newArray[objs.length] = obj;
objs = newArray;
}
/**
* Removes the given object from this stack.
*
* @param obj the object
*/
@StudentImplementationRequired("H9.1.3") // TODO: H9.1.3
public void remove(O obj) {
O[] newArray = (O[]) new Object[objs.length - 1];
int n = 0;
for (O currObj : objs) {
if (currObj == obj) continue;
newArray[n++] = currObj;
}
objs = newArray;
}
/**
* Returns the number of objects in this stack.
*
* @return the number of objects
*/
@DoNotTouch
public int size() {
return objs.length;
}
/**
* Returns the object at the given index in this stack.
*
* @param index the index
* @return the object
*/
@StudentImplementationRequired("H9.1.4") // TODO: H9.1.4
public O get(int index) {
return objs[index];
}
/**
* Removes and returns the top object of this stack.
*
* @return the top object
*/
@StudentImplementationRequired("H9.1.4") // TODO: H9.1.4
public O pop() {
O o = get(objs.length - 1);
remove(o);
return o;
}
/**
* Constructs and returns a stack with the given objects.
* The last object is the top object.
*
* @param objs the objects
* @return the stack
*/
@SafeVarargs
@StudentImplementationRequired("H9.1.5") // TODO: H9.1.5
public static <O> StackOfObjects<O> of(O... objs) {
var stack = new StackOfObjects<O>();
stack.objs = objs;
return stack;
}
}