/// <summary>
        /// A depth first search traversal of the graph, starting from a specified vertex.
        /// Returns the visited vertices of the graph.
        /// </summary>
        public virtual IEnumerable <T> DepthFirstWalk(T source)
        {
            // Check for existence of source
            if (VerticesCount == 0)
            {
                return(new ArrayListGeneric <T>(0));
            }
            else if (!HasVertex(source))
            {
                throw new KeyNotFoundException("The source vertex doesn't exist.");
            }

            var visited     = new HashSet <T>();
            var stack       = new StackGeneric <T>();
            var listOfNodes = new ArrayListGeneric <T>(VerticesCount);

            stack.Push(source);

            while (!stack.IsEmpty)
            {
                var current = stack.Pop();

                if (!visited.Contains(current))
                {
                    listOfNodes.Add(current);
                    visited.Add(current);

                    foreach (var adjacent in Neighbours(current))
                    {
                        if (!visited.Contains(adjacent))
                        {
                            stack.Push(adjacent);
                        }
                    }
                }
            }

            return(listOfNodes);
        }
Exemple #2
0
        public void StackTests()
        {
            bool   hasException             = false;
            object peekObject               = new object();
            object poppedItem               = new object();
            StackGeneric <int?>      stack1 = new StackGeneric <int?>();
            StackComparable <int>    stack2 = new StackComparable <int>();
            StackComparable <string> stack3 = new StackComparable <string>();

            #region StackTest :: empty stack<non-nullable>

            try
            {
                peekObject = stack2.Peek();
            }
            catch (StackOperationException e)
            {
                hasException = true;
                Assert.IsNotNull(e.Message);
            }
            finally
            {
                Assert.IsNotNull(peekObject);
                Assert.IsTrue(hasException);
            }

            hasException = false;
            try
            {
                poppedItem = stack2.Pop();
            }
            catch (StackOperationException e)
            {
                hasException = true;
                Assert.IsNotNull(e.Message);
            }
            finally
            {
                Assert.IsNotNull(poppedItem);
                Assert.IsTrue(hasException);
            }

            #endregion

            #region StackTest :: empty stack<nullable>

            hasException = false;
            try
            {
                peekObject = stack1.Peek();
            }
            catch (StackOperationException e)
            {
                hasException = true;
                Assert.IsNotNull(e.Message); //should never come here
            }
            finally
            {
                Assert.IsFalse(hasException);
                Assert.IsNull(peekObject);
            }

            hasException = false;
            try
            {
                var test1 = "stack3.test1";
                stack3.Push(test1);
                peekObject = stack3.Peek();
                poppedItem = stack3.Pop();
                Assert.IsTrue(poppedItem.Equals(peekObject));
                Assert.IsTrue(poppedItem.Equals(test1));
                Assert.IsNotNull(poppedItem);

                poppedItem = stack3.Pop();
            }
            catch (StackOperationException e)
            {
                hasException = true;
                Assert.IsNotNull(e.Message); //should never come here
            }
            finally
            {
                Assert.IsFalse(hasException);
                Assert.IsNull(poppedItem);
            }

            hasException = false;
            try
            {
                peekObject = stack3.Peek();
            }
            catch (StackOperationException e)
            {
                hasException = true;
                Assert.IsNotNull(e.Message); //should never come here
            }
            finally
            {
                Assert.IsFalse(hasException);
                Assert.IsNull(peekObject);
            }

            #endregion

            #region StackTest :: Get the minimum in the stack

            var test3_1 = "abcd";
            var test3_2 = "ABCD";
            var test3_3 = "";
            var test3_4 = "xyz...12345";
            var test3_5 = "5555";

            stack3.Push(test3_1);
            Assert.IsTrue(test3_1.Equals(stack3.GetMinimum()));
            Assert.IsTrue(test3_1.Equals(stack3.Minimum));

            stack3.Push(test3_2);
            Assert.IsTrue(test3_1.Equals(stack3.GetMinimum()));
            Assert.IsTrue(test3_1.Equals(stack3.Minimum));

            stack3.Push(test3_3);
            Assert.IsTrue(test3_3.Equals(stack3.GetMinimum()));
            Assert.IsTrue(test3_3.Equals(stack3.Minimum));

            stack3.Pop();

            stack3.Push(test3_4);
            Assert.IsTrue(test3_1.Equals(stack3.GetMinimum()));
            Assert.IsTrue(test3_1.Equals(stack3.Minimum));

            stack3.Push(test3_5);
            Assert.IsTrue(test3_5.Equals(stack3.GetMinimum()));
            Assert.IsTrue(test3_5.Equals(stack3.Minimum));

            #endregion

            #region StackTest ::

            #endregion
        }