// Michael Tartaglia
// Stack.java -- the Stack data structure

public class Stack {
	private StackNode head;
	private int size;

	// CONSTRUCTORS
	public Stack(int i) {
	 head = new StackNode((double)i, null);
	 size = 0;
	}
	public Stack(double i) {
	 head = new StackNode(i, null);
	 size = 0;
	}
	public Stack() {
	 head = null; 
	 size = 0;
	}

	// EMPTY CHECK
	public boolean isEmpty() { return (head == null); }

	// POP THE TOP OFF STACK
	public double pop() {
	 double item = head.getItem();
	 StackNode hold = head.next();
	 head.destroy();
	 head = hold;
	 size--;
	 return item;
	}

	// READ THE TOP OF THE STACK
	public double getTop() { return head.getItem(); }

	// ADD NEW ITEM ONTO STACK
	public void push(double i) {
	 head = new StackNode(i, head);
	 size++;
	}
	
	public int itemsOnStack() { return size; }
}



class StackNode {
	private StackNode link;
	private double item;

	// CONSTRUCTORS
	public StackNode(int i) {this( (double)i, null );}
	public StackNode(double i) {this( i, null );}
	public StackNode(int i, StackNode l) {this( (double)i, l );}
	public StackNode(double i, StackNode l) {
	 link = l;
	 item = i;
	}

	// GET ITEM
	public int getIntItem() { return (int)item; }
	public double getItem() { return item; }
	
	// DESTROY LINK
	public void destroy() { link = null; }
	
	// NEXT IN STACK
	public StackNode next() { return link; }
}
