Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 非递归方式列出目录和子目录中的文件,而不使用堆栈/队列_Algorithm_Recursion_Stack_Queue - Fatal编程技术网

Algorithm 非递归方式列出目录和子目录中的文件,而不使用堆栈/队列

Algorithm 非递归方式列出目录和子目录中的文件,而不使用堆栈/队列,algorithm,recursion,stack,queue,Algorithm,Recursion,Stack,Queue,在一次采访中,我被要求列出目录及其子目录“”中的文件名,而不使用递归、堆栈或队列 因为我所知道的唯一一种非递归方法使用堆栈,所以我无法回答这个问题 面试官解释了解决办法,但我无法理解。我唯一记得的是,它涉及两种方法,而不是一种 这种方法允许在目录及其子目录中列出文件,而无需递归、无堆栈或队列,这是什么 这一解决方案与语言无关。子目录列表由ListDirectories(string directoryPath)方法提供,文件由ListFiles(string directoryPath)提供。

在一次采访中,我被要求列出目录及其子目录“”中的文件名,而不使用递归、堆栈或队列

因为我所知道的唯一一种非递归方法使用堆栈,所以我无法回答这个问题

面试官解释了解决办法,但我无法理解。我唯一记得的是,它涉及两种方法,而不是一种

这种方法允许在目录及其子目录中列出文件,而无需递归、无堆栈或队列,这是什么



这一解决方案与语言无关。子目录列表由
ListDirectories(string directoryPath)
方法提供,文件由
ListFiles(string directoryPath)
提供。我们事先不知道子目录的深度。

在深度优先搜索中,请注意当前路径基本上充当堆栈。以深度优先的方式列出名称,按照您预期的方式进行,但不要费心记录堆栈。。。在目录中列出文件后,您可以通过记录您所在的最后一个目录来“弹出”堆栈,然后从父目录中的该点继续操作。

尝试类似的操作(伪代码):


我们只使用列表:)但这种方法与堆栈/队列解决方案非常相似

您是否允许使用ADT对添加/删除的元素施加不同于FIFO或LIFO的顺序(或无顺序)?例如,是否允许您使用一个按名称排序的堆来存储所有未查找的文件夹?严格地说,这既不是堆栈也不是队列。您可以创建一个正在浏览的文件夹树。您可以在每个节点上使用一个标志来标记该节点是否已访问。@vitalik:您可以将树视为队列/列表的更高级版本。谢谢-我整个上午都在想这里的意思。。。我必须补充一点,这是一个相当蹩脚的面试问题。这不是关于理解任何重要的事情-只是玩“隐藏堆栈”。。。但也许我只是因为看不到这个答案而感到痛苦。在我看来,这是一个半聪明的问题,但我同意这个措辞还有很多需要改进的地方,因为它非常不精确。你在使用队列。如果你称之为列表,那没关系。您正在将列表用作队列。您将从列表的开始处对项目进行排队,并在列表的结尾处对项目进行排队。在我看来,在面试中提出这样的建议会让你看起来很愚蠢。看起来好像您不知道队列功能是什么,并且您认为如果数据结构不称为队列,那么它就不是队列。事实上,在java中,LinkedList是一个队列(实现队列接口)。
baseDirectory = "/usr"
list = [baseDirectory] // list of directories to traversal
files = []
while (list not empty) {
  d = list.getFirst(); // get directory
  directories = ListDirectories(d);
  files.add(ListFiles(d)); // add all files from current directory
  list.add(directories); //add all directories from current directory to traversal
  list.remove(d); // remove traversed dir
}