// Path: src/main/java/rogeriogentil/data/structures/chapter06/reinforcement/Exercise04.java
// public class Exercise04 {
//    
//    public static <E> void transfer(Stack<E> s, Stack<E> t) {
//       if (s.isEmpty()) {
//          throw new IllegalStateException("Stack S is empty!");
//       }
//       
//       while (s.top() != null) {
//          t.push(s.pop());
//       }
//    }
// }
// 
// Path: src/main/java/rogeriogentil/data/structures/chapter06/ArrayStack.java
// public class ArrayStack<E> implements Stack<E> {
// 
//     private static final int CAPACITY = 1000;
//     private int top = -1;
//     private E[] array;
// 
//     public ArrayStack() {
//         this(CAPACITY);
//     }
// 
//     public ArrayStack(final int capacity) {
//         this.array = (E[]) new Object[capacity];    // safe cast; compiler may give warning
//     }
// 
//     @Override
//     public void push(E e) {
//         if (array.length == size()) {
//             throw new IllegalStateException("Stack is full");
//         }
// 
//         top++;
//         array[top] = e;
//     }
// 
//     @Override
//     public E pop() {
//         if (this.isEmpty()) {
//             return null;
//         }
// 
//         E e = array[top];
//         array[top] = null;
//         top--;
//         return e;
//     }
// 
//     @Override
//     public E top() {
//         if (this.isEmpty()) {
//             return null;
//         }
// 
//         return array[top];
//     }
// 
//     @Override
//     public int size() {
//         return this.top + 1;
//     }
// 
//     @Override
//     public boolean isEmpty() {
//         return this.top == -1;
//     }
// 
// }
// 
// Path: src/main/java/rogeriogentil/data/structures/chapter06/Stack.java
// public interface Stack<E> {
//    
//    /**
//     * Adds element e to the top of the stack.
//     * 
//     * @param e E
//     */
//    void push(E e);
//    
//    /**
//     * Removes and returns the top element from the stack (or null if the stack is empty).
//     * 
//     * @return E
//     */
//    E pop();
//    
//    /**
//     * Returns the top element of the stack, without removing it (or null if the stack is empty).
//     * 
//     * @return 
//     */
//    E top();
//    
//    /**
//     * Returns the number of elements in the stack.
//     * 
//     * @return Size of stack
//     */
//    int size();
//    
//    /**
//     * Returns a boolean indicating whether the stack is empty.
//     * 
//     * @return {@code true} or {@code false}
//     */
//    boolean isEmpty();
//    
// }


import rogeriogentil.data.structures.chapter06.reinforcement.Exercise04;
import java.util.Arrays;
import org.junit.Test;
import rogeriogentil.data.structures.chapter06.ArrayStack;
import rogeriogentil.data.structures.chapter06.Stack;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
package rogeriogentil.data.structures.chapter06.reinforcement;



/**
 *
 * @author Rogerio J. Gentil
 */
public class Exercise04Test {

   @Test
   public void deveTransferirPilhaInvertendoTopo() {
      Stack<String> s = new ArrayStack<>(5);
      s.push("A");
      s.push("B");
      s.push("C");
      s.push("D");

// Path: src/main/java/rogeriogentil/data/structures/chapter06/reinforcement/Exercise04.java
// public class Exercise04 {
//    
//    public static <E> void transfer(Stack<E> s, Stack<E> t) {
//       if (s.isEmpty()) {
//          throw new IllegalStateException("Stack S is empty!");
//       }
//       
//       while (s.top() != null) {
//          t.push(s.pop());
//       }
//    }
// }
// 
// Path: src/main/java/rogeriogentil/data/structures/chapter06/ArrayStack.java
// public class ArrayStack<E> implements Stack<E> {
// 
//     private static final int CAPACITY = 1000;
//     private int top = -1;
//     private E[] array;
// 
//     public ArrayStack() {
//         this(CAPACITY);
//     }
// 
//     public ArrayStack(final int capacity) {
//         this.array = (E[]) new Object[capacity];    // safe cast; compiler may give warning
//     }
// 
//     @Override
//     public void push(E e) {
//         if (array.length == size()) {
//             throw new IllegalStateException("Stack is full");
//         }
// 
//         top++;
//         array[top] = e;
//     }
// 
//     @Override
//     public E pop() {
//         if (this.isEmpty()) {
//             return null;
//         }
// 
//         E e = array[top];
//         array[top] = null;
//         top--;
//         return e;
//     }
// 
//     @Override
//     public E top() {
//         if (this.isEmpty()) {
//             return null;
//         }
// 
//         return array[top];
//     }
// 
//     @Override
//     public int size() {
//         return this.top + 1;
//     }
// 
//     @Override
//     public boolean isEmpty() {
//         return this.top == -1;
//     }
// 
// }
// 
// Path: src/main/java/rogeriogentil/data/structures/chapter06/Stack.java
// public interface Stack<E> {
//    
//    /**
//     * Adds element e to the top of the stack.
//     * 
//     * @param e E
//     */
//    void push(E e);
//    
//    /**
//     * Removes and returns the top element from the stack (or null if the stack is empty).
//     * 
//     * @return E
//     */
//    E pop();
//    
//    /**
//     * Returns the top element of the stack, without removing it (or null if the stack is empty).
//     * 
//     * @return 
//     */
//    E top();
//    
//    /**
//     * Returns the number of elements in the stack.
//     * 
//     * @return Size of stack
//     */
//    int size();
//    
//    /**
//     * Returns a boolean indicating whether the stack is empty.
//     * 
//     * @return {@code true} or {@code false}
//     */
//    boolean isEmpty();
//    
// }


// Path: src/test/java/rogeriogentil/data/structures/chapter06/reinforcement/Exercise04Test.java
import rogeriogentil.data.structures.chapter06.reinforcement.Exercise04;
import java.util.Arrays;
import org.junit.Test;
import rogeriogentil.data.structures.chapter06.ArrayStack;
import rogeriogentil.data.structures.chapter06.Stack;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

package rogeriogentil.data.structures.chapter06.reinforcement;



/**
 *
 * @author Rogerio J. Gentil
 */
public class Exercise04Test {

   @Test
   public void deveTransferirPilhaInvertendoTopo() {
      Stack<String> s = new ArrayStack<>(5);
      s.push("A");
      s.push("B");
      s.push("C");
      s.push("D");

      Stack<String> t = new ArrayStack<>(5);