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 +}