diff --git a/a1/src/edu/wmich/cs3310/a1/DataStructures/CharQueue.java b/a1/src/edu/wmich/cs3310/a1/DataStructures/CharQueue.java
index 94c0ab25b123fd4a541850a9b68b123358bd8b3b..063211bff7d287a3c8d720d66f12270abc6dc5f3 100644
--- a/a1/src/edu/wmich/cs3310/a1/DataStructures/CharQueue.java
+++ b/a1/src/edu/wmich/cs3310/a1/DataStructures/CharQueue.java
@@ -4,7 +4,7 @@ package edu.wmich.cs3310.a1.DataStructures;
 /**
  * Queue implementation of linked list.
  */
-public class CharQueue {
+public class CharQueue extends CharList {
 
     //region Variables
 
@@ -26,7 +26,22 @@ public class CharQueue {
 
     //region Properties
 
+    /**
+     * Getter for queue head node.
+     * @return Node currently in head position.
+     */
+    public CharNode headNode() {
+        return firstNode;
+    }
+
 
+    /**
+     * Getter for queue tail node.
+     * @return Node currently in tail position.
+     */
+    public CharNode tailNode() {
+        return lastNode;
+    }
 
     //endregion Properties
 
@@ -34,7 +49,50 @@ public class CharQueue {
 
     //region Methods
 
+    /**
+     * Adds new node to tail of list.
+     * @param character Character for node to hold.
+     */
+    public void Enqueue(char character) {
+        CharNode newNode = new CharNode();
+        newNode.myData(character);
+
+        // Check if list is empty.
+        if (firstNode == null) {
+            firstNode = newNode;
+            lastNode = newNode;
+        } else {
+            newNode.prevNode(lastNode);
+            lastNode.nextNode(newNode);
+            lastNode = newNode;
+        }
+    }
+
 
+    /**
+     * Removes node from list head.
+     * @return Removed node or null if list is empty.
+     */
+    public CharNode Dequeue() {
+        CharNode tempNode = new CharNode();
+
+        // Check if list is empty.
+        if (firstNode == null) {
+            return null;
+        } else {
+            tempNode = firstNode;
+            firstNode = firstNode.nextNode();
+            tempNode.nextNode(null);
+
+            // Check if list was only one element.
+            if (firstNode == null) {
+                lastNode = null;
+            } else {
+                firstNode.prevNode(null);
+            }
+        }
+        return tempNode;
+    }
 
     //endregion Methods
 
diff --git a/a1/src/edu/wmich/cs3310/a1/DataStructures/CharStack.java b/a1/src/edu/wmich/cs3310/a1/DataStructures/CharStack.java
index 3d728a31330bc909c1a4667106c2ad883a952960..be1b878901d155a543c1a7ea8316e51de0d63295 100644
--- a/a1/src/edu/wmich/cs3310/a1/DataStructures/CharStack.java
+++ b/a1/src/edu/wmich/cs3310/a1/DataStructures/CharStack.java
@@ -4,7 +4,7 @@ package edu.wmich.cs3310.a1.DataStructures;
 /**
  * Stack implementation of linked list.
  */
-public class CharStack {
+public class CharStack extends CharList {
 
     //region Variables
 
@@ -27,6 +27,13 @@ public class CharStack {
     //region Properties
 
 
+    /**
+     * Getter for stack head node.
+     * @return Node currently in head position.
+     */
+    public CharNode headNode() {
+        return firstNode;
+    }
 
     //endregion Properties
 
@@ -34,15 +41,50 @@ public class CharStack {
 
     //region Methods
 
-    public void Push() {
-
+    /**
+     * Adds new node to list head.
+     * @param character Character for node to hold.
+     */
+    public void Push(char character) {
+        CharNode newNode = new CharNode();
+        newNode.myData(character);
+
+        // Check if list is empty.
+        if (firstNode == null) {
+            firstNode = newNode;
+            lastNode = newNode;
+        } else {
+            newNode.nextNode(firstNode);
+            firstNode.prevNode(newNode);
+            firstNode = newNode;
+        }
     }
 
 
-
-    //public CharNode Pop() {
-
-    //}
+    /**
+     * Removes top node from list head.
+     * @return Removed node or null if list is empty.
+     */
+    public CharNode Pop() {
+        CharNode tempNode;
+
+        // Check if list is empty.
+        if (firstNode == null) {
+            return null;
+        } else {
+            tempNode = firstNode;
+            firstNode = firstNode.nextNode();
+            tempNode.nextNode(null);
+
+            // Check if list was only one element.
+            if (firstNode == null) {
+                lastNode = null;
+            } else {
+                firstNode.prevNode(null);
+            }
+        }
+        return tempNode;
+    }
 
     //endregion Methods
 
diff --git a/a1/tests/CharListTests.java b/a1/tests/CharListTests.java
index 465aff1e299092ad79eaa4b0d93dc6370d6956e5..230fe7986979db014c9191e76bab0ed5ca20df1a 100644
--- a/a1/tests/CharListTests.java
+++ b/a1/tests/CharListTests.java
@@ -32,7 +32,6 @@ public class CharListTests {
 
     @Test
     public void Test_Insert_Success_OnlyFirst() {
-        // Test inserting with 0 nodes.
         Assert.assertNull(aList.firstNode());
         Assert.assertNull(aList.lastNode());
 
@@ -60,7 +59,6 @@ public class CharListTests {
 
     @Test
     public void Test_Insert_Success_OnlyLast() {
-        // Test inserting with 0 nodes.
         Assert.assertNull(aList.firstNode());
         Assert.assertNull(aList.lastNode());
 
diff --git a/a1/tests/CharQueueTests.java b/a1/tests/CharQueueTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..047d2ac3e8c3301b222b483c94ad1f4a1ee8082c
--- /dev/null
+++ b/a1/tests/CharQueueTests.java
@@ -0,0 +1,110 @@
+
+import org.junit.Before;
+import org.junit.Assert;
+import org.junit.Test;
+
+import edu.wmich.cs3310.a1.DataStructures.CharQueue;
+import edu.wmich.cs3310.a1.DataStructures.CharNode;
+
+
+/**
+ * Tests for CharQueue class.
+ */
+public class CharQueueTests {
+
+    //region Variables
+
+    CharNode aNode;
+    CharQueue aQueue;
+
+    //endregion Variables
+
+    //region Tests
+
+    @Before
+    public void setUp() {
+        aNode = new CharNode();
+        aQueue = new CharQueue();
+    }
+
+
+    @Test
+    public void Test_Enqueue() {
+        Assert.assertNull(aQueue.headNode());
+        Assert.assertNull(aQueue.tailNode());
+
+        // Test enqueueing with one node.
+        aQueue.Enqueue('a');
+        Assert.assertEquals('a', aQueue.headNode().myData());
+        Assert.assertNull(aQueue.headNode().prevNode());
+        Assert.assertNull(aQueue.tailNode().nextNode());
+        Assert.assertEquals(aQueue.headNode(), aQueue.tailNode());
+
+        // Test enqueueing with two nodes.
+        aQueue.Enqueue('b');
+        Assert.assertEquals('a', aQueue.headNode().myData());
+        Assert.assertEquals('b', aQueue.tailNode().myData());
+        Assert.assertNull(aQueue.headNode().prevNode());
+        Assert.assertNull(aQueue.tailNode().nextNode());
+        Assert.assertEquals(aQueue.headNode(), aQueue.tailNode().prevNode());
+        Assert.assertEquals(aQueue.tailNode(), aQueue.headNode().nextNode());
+
+        // Test enqueueing with three nodes.
+        aQueue.Enqueue('c');
+        Assert.assertEquals('a', aQueue.headNode().myData());
+        Assert.assertEquals('b', aQueue.headNode().nextNode().myData());
+        Assert.assertEquals('c', aQueue.tailNode().myData());
+        Assert.assertNull(aQueue.headNode().prevNode());
+        Assert.assertNull(aQueue.tailNode().nextNode());
+        Assert.assertEquals(aQueue.headNode(), aQueue.tailNode().prevNode().prevNode());
+        Assert.assertEquals(aQueue.headNode().nextNode(), aQueue.tailNode().prevNode());
+        Assert.assertEquals(aQueue.headNode().nextNode().nextNode(), aQueue.tailNode());
+    }
+
+
+    @Test
+    public void Test_Dequeue() {
+        aQueue.Enqueue('a');
+        aQueue.Enqueue('b');
+        aQueue.Enqueue('c');
+
+        // Test dequeueing with three nodes.
+        aNode = aQueue.Dequeue();
+        Assert.assertNotNull(aNode);
+        Assert.assertEquals('a', aNode.myData());
+        Assert.assertNull(aNode.prevNode());
+        Assert.assertNull(aNode.nextNode());
+        Assert.assertEquals('b', aQueue.headNode().myData());
+        Assert.assertEquals('c', aQueue.tailNode().myData());
+        Assert.assertNull(aQueue.headNode().prevNode());
+        Assert.assertNull(aQueue.tailNode().nextNode());
+        Assert.assertEquals(aQueue.headNode(), aQueue.tailNode().prevNode());
+        Assert.assertEquals(aQueue.tailNode(), aQueue.headNode().nextNode());
+
+        // Test dequeueing with two nodes.
+        aNode = aQueue.Dequeue();
+        Assert.assertNotNull(aNode);
+        Assert.assertEquals('b', aNode.myData());
+        Assert.assertNull(aNode.prevNode());
+        Assert.assertNull(aNode.nextNode());
+        Assert.assertEquals('c', aQueue.headNode().myData());
+        Assert.assertNull(aQueue.headNode().prevNode());
+        Assert.assertNull(aQueue.headNode().nextNode());
+        Assert.assertEquals(aQueue.headNode(), aQueue.tailNode());
+
+        // Test dequeueing with one node.
+        aNode = aQueue.Dequeue();
+        Assert.assertNotNull(aNode);
+        Assert.assertEquals('c', aNode.myData());
+        Assert.assertNull(aNode.prevNode());
+        Assert.assertNull(aNode.nextNode());
+        Assert.assertNull(aQueue.headNode());
+        Assert.assertNull(aQueue.tailNode());
+
+        // Test dequeueing with zero nodes.
+        aNode = aQueue.Dequeue();
+        Assert.assertNull(aNode);
+    }
+
+    //endregion Tests
+}
diff --git a/a1/tests/CharStackTests.java b/a1/tests/CharStackTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc996b3836f9dbdc8c8d34e41826a3df79d52453
--- /dev/null
+++ b/a1/tests/CharStackTests.java
@@ -0,0 +1,100 @@
+
+import org.junit.Before;
+import org.junit.Assert;
+import org.junit.Test;
+
+import edu.wmich.cs3310.a1.DataStructures.CharStack;
+import edu.wmich.cs3310.a1.DataStructures.CharNode;
+
+
+/**
+ * Tests for CharStack class.
+ */
+public class CharStackTests {
+
+    //region Variables
+
+    CharNode aNode;
+    CharStack aStack;
+
+    //endregion Variables
+
+    //region Tests
+
+    @Before
+    public void setUp() {
+        aNode = new CharNode();
+        aStack = new CharStack();
+    }
+
+
+    @Test
+    public void Test_Push() {
+        Assert.assertNull(aStack.headNode());
+
+        // Test pushing with 1 node.
+        aStack.Push('a');
+        Assert.assertEquals('a', aStack.headNode().myData());
+        Assert.assertNull(aStack.headNode().prevNode());
+        Assert.assertNull(aStack.headNode().nextNode());
+
+        // Test pushing with 2 nodes.
+        aStack.Push('b');
+        Assert.assertEquals('b', aStack.headNode().myData());
+        Assert.assertEquals('a', aStack.headNode().nextNode().myData());
+        Assert.assertNull(aStack.headNode().prevNode());
+        Assert.assertNull(aStack.headNode().nextNode().nextNode());
+
+
+        // Test pushing with 3 nodes.
+        aStack.Push('c');
+        Assert.assertEquals('c', aStack.headNode().myData());
+        Assert.assertEquals('b', aStack.headNode().nextNode().myData());
+        Assert.assertEquals('a', aStack.headNode().nextNode().nextNode().myData());
+        Assert.assertNull(aStack.headNode().prevNode());
+        Assert.assertNull(aStack.headNode().nextNode().nextNode().nextNode());
+    }
+
+
+    @Test
+    public void Test_Pop() {
+        aStack.Push('a');
+        aStack.Push('b');
+        aStack.Push('c');
+
+        // Test popping with 3 nodes.
+        aNode = aStack.Pop();
+        Assert.assertNotNull(aNode);
+        Assert.assertEquals('c', aNode.myData());
+        Assert.assertNull(aNode.prevNode());
+        Assert.assertNull(aNode.nextNode());
+        Assert.assertEquals('b', aStack.headNode().myData());
+        Assert.assertEquals('a', aStack.headNode().nextNode().myData());
+        Assert.assertNull(aStack.headNode().prevNode());
+        Assert.assertNull(aStack.headNode().nextNode().nextNode());
+
+        // Test popping with 2 nodes.
+        aNode = aStack.Pop();
+        Assert.assertNotNull(aNode);
+        Assert.assertEquals('b', aNode.myData());
+        Assert.assertNull(aNode.prevNode());
+        Assert.assertNull(aNode.nextNode());
+        Assert.assertEquals('a', aStack.headNode().myData());
+        Assert.assertNull(aStack.headNode().prevNode());
+        Assert.assertNull(aStack.headNode().nextNode());
+
+        // Test popping with 1 node.
+        aNode = aStack.Pop();
+        Assert.assertNotNull(aNode);
+        Assert.assertEquals('a', aNode.myData());
+        Assert.assertNull(aNode.prevNode());
+        Assert.assertNull(aNode.nextNode());
+        Assert.assertNull(aStack.headNode());
+
+        // Test popping with 0 nodes.
+        aNode = aStack.Pop();
+        Assert.assertNull(aNode);
+    }
+
+    //endregion Tests
+}