def dfs_iter(graph: dict, target, start=None) -> bool:
    """Iterative DFS.

        Args:
            graph: keys are vertices, values are lists of adjacent vertices
            target: node value to search for
            start: node to start search from

        Examples:
        >>> dfs_iter(graph, 7)
        True
        >>> dfs_iter(graph, 8)
        False

        Returns:
            True if `target` found. Otherwise, False.
    """
    if not graph or target not in graph or (start is not None and start not in graph):
        return False
    if start is None:
        start = list(graph.keys())[0]
    stack = [start]
    visited = []
    while stack:
        v = stack.pop()
        if v == target:
            return True
        if v not in visited:
            visited.append(v)
            for adj in graph[v]:
                stack.append(adj)
    return False