diff --git a/DataStructures/Stacks/StackArray.java b/DataStructures/Stacks/StackArray.java
new file mode 100644
index 00000000..6e580918
--- /dev/null
+++ b/DataStructures/Stacks/StackArray.java
@@ -0,0 +1,152 @@
+/**
+ * This class implements a Stack using a regular array.
+ *
+ * A stack is exactly what it sounds like. An element gets added to the top of
+ * the stack and only the element on the top may be removed. This is an example
+ * of an array implementation of a Stack. So an element can only be added/removed
+ * from the end of the array. In theory stack have no fixed size, but with an
+ * array implementation it does.
+ *
+ * @author Unknown
+ */
+public class StackArray {
+
+ /**
+ * Main method
+ *
+ * @param args Command line arguments
+ */
+ public static void main(String[] args) {
+ // Declare a stack of maximum size 4
+ StackArray myStackArray = new StackArray(4);
+
+ // Populate the stack
+ myStackArray.push(5);
+ myStackArray.push(8);
+ myStackArray.push(2);
+ myStackArray.push(9);
+
+ System.out.println("*********************Stack Array Implementation*********************");
+ System.out.println(myStackArray.isEmpty()); // will print false
+ System.out.println(myStackArray.isFull()); // will print true
+ System.out.println(myStackArray.peek()); // will print 9
+ System.out.println(myStackArray.pop()); // will print 9
+ System.out.println(myStackArray.peek()); // will print 2
+ }
+
+ /**
+ * The max size of the Stack
+ */
+ private int maxSize;
+
+ /**
+ * The array representation of the Stack
+ */
+ private int[] stackArray;
+
+ /**
+ * The top of the stack
+ */
+ private int top;
+
+ /**
+ * Constructor
+ *
+ * @param size Size of the Stack
+ */
+ public StackArray(int size) {
+ maxSize = size;
+ stackArray = new int[maxSize];
+ top = -1;
+ }
+
+ /**
+ * Adds an element to the top of the stack
+ *
+ * @param value The element added
+ */
+ public void push(int value) {
+ if (!isFull()) { // Checks for a full stack
+ top++;
+ stackArray[top] = value;
+ } else {
+ resize(maxSize * 2);
+ push(value); // don't forget push after resizing
+ }
+ }
+
+ /**
+ * Removes the top element of the stack and returns the value you've removed
+ *
+ * @return value popped off the Stack
+ */
+ public int pop() {
+ if (!isEmpty()) { // Checks for an empty stack
+ return stackArray[top--];
+ }
+
+ if (top < maxSize / 4) {
+ resize(maxSize / 2);
+ return pop();// don't forget pop after resizing
+ } else {
+ System.out.println("The stack is already empty");
+ return -1;
+ }
+ }
+
+ /**
+ * Returns the element at the top of the stack
+ *
+ * @return element at the top of the stack
+ */
+ public int peek() {
+ if (!isEmpty()) { // Checks for an empty stack
+ return stackArray[top];
+ } else {
+ System.out.println("The stack is empty, cant peek");
+ return -1;
+ }
+ }
+
+ private void resize(int newSize) {
+ // private int[] transferArray = new int[newSize]; we can't put modifiers here !
+ int[] transferArray = new int[newSize];
+
+ // for(int i = 0; i < stackArray.length(); i++){ the length isn't a method .
+ for (int i = 0; i < stackArray.length; i++) {
+ transferArray[i] = stackArray[i];
+ stackArray = transferArray;
+ }
+ maxSize = newSize;
+ }
+
+ /**
+ * Returns true if the stack is empty
+ *
+ * @return true if the stack is empty
+ */
+ public boolean isEmpty() {
+ return (top == -1);
+ }
+
+ /**
+ * Returns true if the stack is full
+ *
+ * @return true if the stack is full
+ */
+ public boolean isFull() {
+ return (top + 1 == maxSize);
+ }
+
+ /**
+ * Deletes everything in the Stack
+ *
+ * Doesn't delete elements in the array
+ * but if you call push method after calling
+ * makeEmpty it will overwrite previous
+ * values
+ */
+ public void makeEmpty() { // Doesn't delete elements in the array but if you call
+ top = -1; // push method after calling makeEmpty it will overwrite previous values
+ }
+}
diff --git a/DataStructures/Stacks/StackArrayList.java b/DataStructures/Stacks/StackArrayList.java
new file mode 100644
index 00000000..afc80444
--- /dev/null
+++ b/DataStructures/Stacks/StackArrayList.java
@@ -0,0 +1,95 @@
+import java.util.ArrayList;
+
+/**
+ * This class implements a Stack using an ArrayList.
+ *
+ * A stack is exactly what it sounds like. An element gets added to the top of
+ * the stack and only the element on the top may be removed.
+ *
+ * This is an ArrayList Implementation of a stack, where size is not
+ * a problem we can extend the stack as much as we want.
+ *
+ * @author Unknown
+ */
+public class StackArrayList {
+
+ /**
+ * Main method
+ *
+ * @param args Command line arguments
+ */
+ public static void main(String[] args) {
+
+ StackArrayList myStackArrayList = new StackArrayList();
+
+ myStackArrayList.push(5);
+ myStackArrayList.push(8);
+ myStackArrayList.push(2);
+ myStackArrayList.push(9);
+
+ System.out.println("*********************Stack List Implementation*********************");
+ System.out.println(myStackArrayList.isEmpty()); // will print false
+ System.out.println(myStackArrayList.peek()); // will print 9
+ System.out.println(myStackArrayList.pop()); // will print 9
+ System.out.println(myStackArrayList.peek()); // will print 2
+ System.out.println(myStackArrayList.pop()); // will print 2
+ }
+
+ /**
+ * ArrayList representation of the stack
+ */
+ private ArrayList stackList;
+
+ /**
+ * Constructor
+ */
+ public StackArrayList() {
+ stackList = new ArrayList<>();
+ }
+
+ /**
+ * Adds value to the end of list which
+ * is the top for stack
+ *
+ * @param value value to be added
+ */
+ public void push(int value) {
+ stackList.add(value);
+ }
+
+ /**
+ * Pops last element of list which is indeed
+ * the top for Stack
+ *
+ * @return Element popped
+ */
+ public int pop() {
+
+ if (!isEmpty()) { // checks for an empty Stack
+ int popValue = stackList.get(stackList.size() - 1);
+ stackList.remove(stackList.size() - 1); // removes the poped element from the list
+ return popValue;
+ }
+
+ System.out.print("The stack is already empty!");
+ return -1;
+ }
+
+ /**
+ * Checks for empty Stack
+ *
+ * @return true if stack is empty
+ */
+ public boolean isEmpty() {
+ return stackList.isEmpty();
+ }
+
+ /**
+ * Top element of stack
+ *
+ * @return top element of stack
+ */
+ public int peek() {
+ return stackList.get(stackList.size() - 1);
+ }
+}
diff --git a/DataStructures/Stacks/Stacks.java b/DataStructures/Stacks/Stacks.java
deleted file mode 100644
index 2861ef5c..00000000
--- a/DataStructures/Stacks/Stacks.java
+++ /dev/null
@@ -1,240 +0,0 @@
-import java.util.ArrayList;
-
-/**
- * This class implements a Stack using two different implementations.
- * Stack is used with a regular array and Stack2 uses an ArrayList.
- *
- * A stack is exactly what it sounds like. An element gets added to the top of
- * the stack and only the element on the top may be removed. This is an example
- * of an array implementation of a Stack. So an element can only be added/removed
- * from the end of the array. In theory stack have no fixed size, but with an
- * array implementation it does.
- *
- * @author Unknown
- *
- */
-class Stack{
- /** The max size of the Stack */
- private int maxSize;
- /** The array representation of the Stack */
- private int[] stackArray;
- /** The top of the stack */
- private int top;
-
- /**
- * Constructor
- *
- * @param size Size of the Stack
- */
- public Stack(int size){
- maxSize = size;
- stackArray = new int[maxSize];
- top = -1;
- }
-
- /**
- * Adds an element to the top of the stack
- *
- * @param value The element added
- */
- public void push(int value){
- if(!isFull()){ //Checks for a full stack
- top++;
- stackArray[top] = value;
- }else{
- resize(maxSize*2);
- push(value);// don't forget push after resizing
- }
- }
-
- /**
- * Removes the top element of the stack and returns the value you've removed
- *
- * @return value popped off the Stack
- */
- public int pop(){
- if(!isEmpty()){ //Checks for an empty stack
- return stackArray[top--];
- }
-
- if(top < maxSize/4){
- resize(maxSize/2);
- return pop();// don't forget pop after resizing
- }
- else{
- System.out.println("The stack is already empty");
- return -1;
- }
- }
-
- /**
- * Returns the element at the top of the stack
- *
- * @return element at the top of the stack
- */
- public int peek(){
- if(!isEmpty()){ //Checks for an empty stack
- return stackArray[top];
- }else{
- System.out.println("The stack is empty, cant peek");
- return -1;
- }
- }
-
- private void resize(int newSize){
- //private int[] transferArray = new int[newSize]; we can't put modifires here !
- int[] transferArray = new int[newSize];
-
- //for(int i = 0; i < stackArray.length(); i++){ the length isn't a method .
- for(int i = 0; i < stackArray.length; i++){
- transferArray[i] = stackArray[i];
- stackArray = transferArray;
- }
- maxSize = newSize;
- }
-
- /**
- * Returns true if the stack is empty
- *
- * @return true if the stack is empty
- */
- public boolean isEmpty(){
- return(top == -1);
- }
-
- /**
- * Returns true if the stack is full
- *
- * @return true if the stack is full
- */
- public boolean isFull(){
- return(top+1 == maxSize);
- }
-
- /**
- * Deletes everything in the Stack
- *
- * Doesn't delete elements in the array
- * but if you call push method after calling
- * makeEmpty it will overwrite previous
- * values
- */
- public void makeEmpty(){ //Doesn't delete elements in the array but if you call
- top = -1; //push method after calling makeEmpty it will overwrite previous values
- }
-}
-
-/**
- * This is an ArrayList Implementation of stack, Where size is not
- * a problem we can extend the stack as much as we want.
- *
- * @author Unknown
- *
- */
-class Stack2{
- /** ArrayList representation of the stack */
- ArrayList stackList;
-
- /**
- * Constructor
- */
- Stack2(){
- stackList=new ArrayList<>();
- }
-
- /**
- * Adds value to the end of list which
- * is the top for stack
- *
- * @param value value to be added
- */
- void push(int value){
- stackList.add(value);
- }
-
- /**
- * Pops last element of list which is indeed
- * the top for Stack
- *
- * @return Element popped
- */
- int pop(){
-
- if(!isEmpty()){ // checks for an empty Stack
-
- int popValue=stackList.get(stackList.size()-1);
- stackList.remove(stackList.size()-1); //removes the poped element from the list
- return popValue;
- }
- else{
- System.out.print("The stack is already empty ");
- return -1;
- }
-
- }
-
- /**
- * Checks for empty Stack
- *
- * @return true if stack is empty
- */
- boolean isEmpty(){
- if(stackList.isEmpty())
- return true;
-
- else return false;
-
- }
-
- /**
- * Top element of stack
- *
- * @return top element of stack
- */
- int peek(){
- return stackList.get(stackList.size()-1);
- }
- }
-
-/**
- * This class implements the Stack and Stack2 created above
- *
- * @author Unknown
- *
- */
-public class Stacks{
- /**
- * Main method
- *
- * @param args Command line arguments
- */
- public static void main(String args[]){
- Stack myStack = new Stack(4); //Declare a stack of maximum size 4
- //Populate the stack
- myStack.push(5);
- myStack.push(8);
- myStack.push(2);
- myStack.push(9);
-
- System.out.println("*********************Stack Array Implementation*********************");
- System.out.println(myStack.isEmpty()); //will print false
- System.out.println(myStack.isFull()); //will print true
- System.out.println(myStack.peek()); //will print 9
- System.out.println(myStack.pop()); //will print 9
- System.out.println(myStack.peek()); // will print 2
-
- Stack2 myStack2 = new Stack2(); //Declare a stack of maximum size 4
- //Populate the stack
- myStack2.push(5);
- myStack2.push(8);
- myStack2.push(2);
- myStack2.push(9);
-
- System.out.println("*********************Stack List Implementation*********************");
- System.out.println(myStack2.isEmpty()); //will print false
- System.out.println(myStack2.peek()); //will print 9
- System.out.println(myStack2.pop()); //will print 9
- System.out.println(myStack2.peek()); // will print 2
- System.out.println(myStack2.pop()); //will print 2
- }
-}
diff --git a/README-ko.md b/README-ko.md
index 0c15ded7..c53868cc 100644
--- a/README-ko.md
+++ b/README-ko.md
@@ -179,7 +179,7 @@ and much more...| and more...
------|-----|
[노드 스택](DataStructures/Stacks/NodeStack.java)|[AVL 트리](DataStructures/Trees/AVLTree.java)|
[연결리스트 스택](DataStructures/Stacks/StackOfLinkedList.java)|[이진 트리](DataStructures/Trees/BinaryTree.java)|
-[스택](DataStructures/Stacks/Stacks.java)|And much more...|
+[스택](DataStructures/Stacks)|And much more...|
* [Bags](DataStructures/Bags/Bag.java)
* [Buffer](DataStructures/Buffers/CircularBuffer.java)
diff --git a/README.md b/README.md
index a8eb9970..08c79b28 100644
--- a/README.md
+++ b/README.md
@@ -181,7 +181,8 @@ Stacks|Trees|
------|-----|
[Node Stack](DataStructures/Stacks/NodeStack.java)|[AVL Tree](DataStructures/Trees/AVLTree.java)|
[Stack of Linked List](DataStructures/Stacks/StackOfLinkedList.java)|[Binary Tree](DataStructures/Trees/BinaryTree.java)|
-[Stacks](DataStructures/Stacks/Stacks.java)|And much more...|
+[Array Stack](DataStructures/Stacks/StackArray.java)|And much more...|
+[ArrayList Stack](DataStructures/Stacks/StackArrayList.java)||
* [Bags](DataStructures/Bags/Bag.java)
* [Buffer](DataStructures/Buffers/CircularBuffer.java)