(Latest Revision: Tue Oct 31 22:28:41 PST 2000 )
ALGORITHM FOR A DEPTH-FIRST TRAVERSAL
PROCEDURE VisitComponentOf (startNode : node) ;
BEGIN
  change the status of startNode to "ready" ;
  push startNode onto the ready stack ;
  WHILE  the ready stack is not empty DO
  BEGIN
    Pop a node X from the ready stack ;
    process(X) ;
    FOR each neighbor Y of X DO
    BEGIN
      IF    the status of Y is "waiting"
      THEN  BEGIN
              change the status of Y to "ready" ;
              Push Y onto the ready stack
            END 
      ELSE  IF    Y is in the ready stack
            THEN  move Y to the top of the ready stack 
    END 
  END 
END ;
(* Above, we could avoid the work of removing duplicate copies
from the "stack" by marking a node "closed" after processing, and
checking each node popped from the stack to see if it is "closed"
before processing.  If it is marked "closed", the algorithm would
not process it, because having that mark means it was processed
earlier at a greater or equal depth.  The cost of this would be
that we could have up to O(N^2) objects on the stack, where N is
the number of nodes in the graph. *) 
PROCEDURE DepthFirstTraversal (G : graph) ;
BEGIN
  Set the status of each node of G to "waiting" ;
  FOR each node N of G DO
    IF    the status of N is waiting
    THEN  VisitComponentOf(N)
END ;