\begin{algorithm}
\caption{Queue Handling Overflow and Underflow}
\begin{algorithmic}
\REQUIRE $Q$ is an array of length $Q.length$ indexed from $1$ with two attributes
$Q.head$ and $Q.tail$ initialized to be $1$
\ENSURE Implementation of queue operations that handle overflow and underflow
\STATE \COMMENT {Returns whether $Q$ is full.}
\PROCEDURE{QueueFull}{$Q$}
\IF{$Q.head == Q.tail + 1$ \OR $Q.head == 1$ \AND $Q.tail == Q.length$}
\RETURN \TRUE
\ENDIF
\RETURN \FALSE
\ENDPROCEDURE
\STATE
\PROCEDURE{Enqueue}{$Q, x$}
\IF{\CALL{QueueFull}{$Q$}}
\STATE \textbf{error} "overflow"
\ELSE
\STATE $Q[Q.tail] = x$
\IF{$Q.tail == Q.length$}
\STATE $Q.tail = 1$
\ELSE
\STATE $Q.tail = Q.tail + 1$
\ENDIF
\ENDIF
\ENDPROCEDURE
\STATE
\STATE \COMMENT {Returns whether $Q$ is empty.}
\PROCEDURE{QueueEmpty}{$Q$}
\IF{$Q.head == Q.tail$}
\RETURN \TRUE
\ENDIF
\RETURN \FALSE
\ENDPROCEDURE
\STATE
\PROCEDURE{Dequeue}{$Q$}
\IF{\CALL{QueueEmpty}{$Q$}}
\STATE \textbf{error} "underflow"
\ELSE
\STATE $x = Q[Q.head]$
\IF{$Q.head == Q.length$}
\STATE $Q.head = 1$
\ELSE
\STATE $Q.head = Q.head + 1$
\ENDIF
\RETURN $x$
\ENDIF
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}