package towerofhanoi;
import java.util.EmptyStackException;
// Virginia Tech Honor Code Pledge:
//
// As a Hokie, I will conduct myself with honor and integrity at all times.
// I will not lie, cheat, or steal, nor will I accept the actions of those who
// do.
// -- Jordan Harrington (jordanha23)
/**
* @author Jordan Harrington
* @version <3/25/2020>
* @param <T>
* - Type T
*/
public class LinkedStack<T> implements StackInterface<T> {
/**
* Private Node class meant for use in LinkedStack
*
* @author Jordan Harrington
* @version <3/25/2020>
* @param <T>
*/
private class Node<T> {
private Node<T> next;
private T data;
/**
* Constructor for node class
*
* @param data
* - the data being stored in the node
*/
public Node(T data) {
this.data = data;
next = null;
}
/**
* Getter for the next node in the stack
*
* @return the next node in the stack
*/
public Node<T> getNextNode() {
return next;
}
/**
* Getter for the data in the node
*
* @return the data being stored in the Node
*/
public T getData() {
return data;
}
/**
* Setter for next
*
* @param nextNode
* - the Node you would like to set as the next Node in the
* stack
*/
public void setNextNode(Node<T> nextNode) {
this.next = nextNode;
}
}
private Node<T> topNode;
private int size;
/**
* Constructor for LinkedStack
*/
public LinkedStack() {
topNode = null;
size = 0;
}
/**
* @return the size of the stack
*/
public int size() {
return size;
}
/**
* Pushes an object onto the stack.
*
* @param anEntry
* - disk to be pushed
* onto the stack.
*/
public void push(T anEntry) {
Node<T> newNode = new Node<T>(anEntry);
newNode.setNextNode(topNode);
topNode = newNode;
size++;
}
/**
* Removes the disk at the top of
* the stack.
*
* @return The disk that was removed.
*/
public T pop() {
if (this.isEmpty()) {
throw new EmptyStackException();
}
Node<T> poppedNode = topNode;
topNode = topNode.next;
size--;
return poppedNode.data;
}
/**
* Checks if the stack is empty.
*
* @return Returns true if the stack is empty.
*/
public boolean isEmpty() {
return (size == 0);
}
/**
* Checks the disk at the top of the
* stack without removing it.
*
* @return disk at the top of the stack.
*/
public T peek() {
if (this.isEmpty()) {
throw new EmptyStackException();
}
return topNode.data;
}
/**
* Clears the stack (removes all of
* the disks from the stack).
*/
public void clear() {
topNode = null;
size = 0;
}
/**
* toString method which displays each item in the stack within brackets
*
* @return a string signifying each push on a stack
*/
public String toString() {
String toString = "[";
Node<T> current = topNode;
while (current != null) {
toString = toString + (current.getData().toString());
if (current.getNextNode() != null) {
toString = toString + ", ";
}
current = current.getNextNode();
}
toString = toString + "]";
return toString;
}
}