// Path: Java-data-Structures/src/main/java/com/stacks/LinkedListImplOfStack.java
// public class LinkedListImplOfStack<Item> implements Stack<Item> {
// 
//     /*
//      * Structure of each node of the linked list
//      */
//     private class Node {
//         Item item;
//         Node next;
//         public Node(Item item, Node next) {
//             this.item = item;
//             this.next = next;
//         }
//     }
// 
//     /*** A reference to the Node on the top of the stack. */
//     private Node topStack;
// 
//     /*** Contains the size of the stack. */
//     private int listSize;
// 
//     /**
//      * Constructs an empty stack.
//      */
//     public LinkedListImplOfStack() {
//         this.listSize = 0;
//         this.topStack = null;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Item pop() {
//         if (this.isEmpty()) {
//             throw new IllegalStateException("The stack is empty");
//         }
//         Item poppedItem = topStack.item;
//         topStack = topStack.next;
//         listSize--;
//         return poppedItem;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Item peek() {
//         if (this.isEmpty()) {
//             throw new IllegalStateException("The stack is empty");
//         }
//         return topStack.item;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public void push(Item item) {
//         topStack = new Node(item, topStack);
//         listSize++;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public boolean isEmpty() {
//         if(topStack == null)
//             return true;
//         return false;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public void clear() {
//         topStack = null;
//         listSize = 0;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public int size() {
//         return listSize;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public boolean contains(Item item) {
//         Node top = topStack;
//         while (top != null) {
//             if (top.item.equals(item))
//                 return true;
//             top = top.next;
//         }
//         return false;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Iterator<Item> iterator() {
//         return new IteratorLinkedListImplOfStack();
//     }
// 
//     /**
//      * IteratorLinkedListImplOfStack implements Iterator interface in order to
//      * provide iterable capabilities to the stack.
//      *
//      * @author STEPHANE MIGUEL KAKANAKOU (Skakanakou@gmail.com)
//      *
//      */
//     private class IteratorLinkedListImplOfStack implements Iterator<Item> {
// 
//         /*** Reference on the current node in the iteration. */
//         private Node currentNode;
// 
//         /*** Constructs IteratorLinkedListImplOfStack. */
//         public IteratorLinkedListImplOfStack() {
//             currentNode = topStack;
//         }
// 
//         /*** {@inheritDoc} */
//         @Override
//         public boolean hasNext() {
//             if (currentNode != null)
//                 return true;
//             return false;
//         }
// 
//         /*** {@inheritDoc} */
//         @Override
//         public Item next() {
//             Item result = currentNode.item;
//             currentNode = currentNode.next;
//             return result;
//         }
//     }
// 
// }
// 
// Path: Java-data-Structures/src/main/java/com/stacks/Stack.java
// public interface Stack<Item> extends Iterable<Item> {
// 
//     /**
//      * Removes and return the object at the top of this stack.
//      *
//      * @return item the object at the top of this stack.
//      *
//      * @exception java.lang.IllegalStateException
//      *                if the Stack is empty
//      */
//     Item pop();
// 
//     /**
//      * Looks at the object at the top of this stack without removing it.
//      *
//      * @return item the object at the top of this stack.
//      *
//      * @exception java.lang.IllegalStateException
//      *                if the Stack is empty
//      */
//     Item peek();
// 
//     /**
//      * Pushes an item onto the top of this stack.
//      *
//      * @param item
//      *            the item to push on the top of the stack
//      *            
//      * @exception java.lang.IllegalStateException
//      *                if item is null
//      */
//     void push(Item item);
// 
//     /**
//      * Tests if this stack is empty.
//      *
//      * @return true if the stack empty and false if not.
//      */
//     boolean isEmpty();
// 
//     /**
//      * Removes all of the elements from this stack.
//      */
//     void clear();
// 
//     /**
//      * Returns the number of elements in this stack.
//      *
//      * @return size the number of elements in this stack.
//      */
//     int size();
// 
//     /**
//      * Returns true if this stack contains the specified element.
//      *
//      * @param item
//      *            the item to look for.
//      *
//      * @return true if the stack contains the item and false if not.
//      */
//     boolean contains(Item item);
// }


import com.stacks.LinkedListImplOfStack;
import com.stacks.Stack;
import junit.framework.TestCase;
package com.test.stacks;




public class TestLinkedListImplOfStack extends TestCase{

    public void testStack() {
// Path: Java-data-Structures/src/main/java/com/stacks/LinkedListImplOfStack.java
// public class LinkedListImplOfStack<Item> implements Stack<Item> {
// 
//     /*
//      * Structure of each node of the linked list
//      */
//     private class Node {
//         Item item;
//         Node next;
//         public Node(Item item, Node next) {
//             this.item = item;
//             this.next = next;
//         }
//     }
// 
//     /*** A reference to the Node on the top of the stack. */
//     private Node topStack;
// 
//     /*** Contains the size of the stack. */
//     private int listSize;
// 
//     /**
//      * Constructs an empty stack.
//      */
//     public LinkedListImplOfStack() {
//         this.listSize = 0;
//         this.topStack = null;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Item pop() {
//         if (this.isEmpty()) {
//             throw new IllegalStateException("The stack is empty");
//         }
//         Item poppedItem = topStack.item;
//         topStack = topStack.next;
//         listSize--;
//         return poppedItem;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Item peek() {
//         if (this.isEmpty()) {
//             throw new IllegalStateException("The stack is empty");
//         }
//         return topStack.item;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public void push(Item item) {
//         topStack = new Node(item, topStack);
//         listSize++;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public boolean isEmpty() {
//         if(topStack == null)
//             return true;
//         return false;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public void clear() {
//         topStack = null;
//         listSize = 0;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public int size() {
//         return listSize;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public boolean contains(Item item) {
//         Node top = topStack;
//         while (top != null) {
//             if (top.item.equals(item))
//                 return true;
//             top = top.next;
//         }
//         return false;
//     }
// 
//     /*** {@inheritDoc} */
//     @Override
//     public Iterator<Item> iterator() {
//         return new IteratorLinkedListImplOfStack();
//     }
// 
//     /**
//      * IteratorLinkedListImplOfStack implements Iterator interface in order to
//      * provide iterable capabilities to the stack.
//      *
//      * @author STEPHANE MIGUEL KAKANAKOU (Skakanakou@gmail.com)
//      *
//      */
//     private class IteratorLinkedListImplOfStack implements Iterator<Item> {
// 
//         /*** Reference on the current node in the iteration. */
//         private Node currentNode;
// 
//         /*** Constructs IteratorLinkedListImplOfStack. */
//         public IteratorLinkedListImplOfStack() {
//             currentNode = topStack;
//         }
// 
//         /*** {@inheritDoc} */
//         @Override
//         public boolean hasNext() {
//             if (currentNode != null)
//                 return true;
//             return false;
//         }
// 
//         /*** {@inheritDoc} */
//         @Override
//         public Item next() {
//             Item result = currentNode.item;
//             currentNode = currentNode.next;
//             return result;
//         }
//     }
// 
// }
// 
// Path: Java-data-Structures/src/main/java/com/stacks/Stack.java
// public interface Stack<Item> extends Iterable<Item> {
// 
//     /**
//      * Removes and return the object at the top of this stack.
//      *
//      * @return item the object at the top of this stack.
//      *
//      * @exception java.lang.IllegalStateException
//      *                if the Stack is empty
//      */
//     Item pop();
// 
//     /**
//      * Looks at the object at the top of this stack without removing it.
//      *
//      * @return item the object at the top of this stack.
//      *
//      * @exception java.lang.IllegalStateException
//      *                if the Stack is empty
//      */
//     Item peek();
// 
//     /**
//      * Pushes an item onto the top of this stack.
//      *
//      * @param item
//      *            the item to push on the top of the stack
//      *            
//      * @exception java.lang.IllegalStateException
//      *                if item is null
//      */
//     void push(Item item);
// 
//     /**
//      * Tests if this stack is empty.
//      *
//      * @return true if the stack empty and false if not.
//      */
//     boolean isEmpty();
// 
//     /**
//      * Removes all of the elements from this stack.
//      */
//     void clear();
// 
//     /**
//      * Returns the number of elements in this stack.
//      *
//      * @return size the number of elements in this stack.
//      */
//     int size();
// 
//     /**
//      * Returns true if this stack contains the specified element.
//      *
//      * @param item
//      *            the item to look for.
//      *
//      * @return true if the stack contains the item and false if not.
//      */
//     boolean contains(Item item);
// }


// Path: Java-data-Structures/src/test/java/com/test/stacks/TestLinkedListImplOfStack.java
import com.stacks.LinkedListImplOfStack;
import com.stacks.Stack;
import junit.framework.TestCase;

package com.test.stacks;




public class TestLinkedListImplOfStack extends TestCase{

    public void testStack() {
        Stack<String> stack = new LinkedListImplOfStack<>();